From e7aaa7f2779a3320a8144e8c118c4354d07155f8 Mon Sep 17 00:00:00 2001 From: manojkumar1053 Date: Fri, 8 Jul 2022 21:46:24 +0000 Subject: [PATCH 1/4] Go Solutions --- go/127-wordLadder.go | 32 ++++++++++ go/130-Surrounded-Regions.go | 60 ++++++++++++++++++ go/139-WordBreak.go | 22 +++++++ go/152-MaximumProductSubarray.go | 29 +++++++++ go/207-CourseSchedule.go | 42 +++++++++++++ go/210-Course_Schedule_II.go | 51 ++++++++++++++++ go/261-GraphValidTree.go | 28 +++++++++ go/286-WallsAndGates.go | 53 ++++++++++++++++ go/322-CoinChange.go | 57 +++++++++++++++++ ...berOfConnectedComponentsUndirectedGraph.go | 34 +++++++++++ go/684-RedundantConnection.go | 31 ++++++++++ go/91-DecodeWays.go | 44 +++++++++++++ go/994-RottingOranges.go | 61 +++++++++++++++++++ 13 files changed, 544 insertions(+) create mode 100644 go/127-wordLadder.go create mode 100644 go/130-Surrounded-Regions.go create mode 100644 go/139-WordBreak.go create mode 100644 go/152-MaximumProductSubarray.go create mode 100644 go/207-CourseSchedule.go create mode 100644 go/210-Course_Schedule_II.go create mode 100644 go/261-GraphValidTree.go create mode 100644 go/286-WallsAndGates.go create mode 100644 go/322-CoinChange.go create mode 100644 go/323-NumberOfConnectedComponentsUndirectedGraph.go create mode 100644 go/684-RedundantConnection.go create mode 100644 go/91-DecodeWays.go create mode 100644 go/994-RottingOranges.go diff --git a/go/127-wordLadder.go b/go/127-wordLadder.go new file mode 100644 index 000000000..44dffe766 --- /dev/null +++ b/go/127-wordLadder.go @@ -0,0 +1,32 @@ +func ladderLength(beginWord string, endWord string, wordList []string) int { + m := make(map[string]bool) + for _, v := range wordList { + m[v] = true + } + list := []string{} + list = append(list, beginWord) + rst := 1 + for len(list) != 0 { + l := len(list) + for i := 0; i < l; i ++ { + word := list[0] + list = list[1:] + if word == endWord { + return rst + } + m[word] = false + for i, _ := range word { + for j := 0; j < 26; j++ { + tmp := []rune(word) + tmp[i] = rune('a' + j) + ts := string(tmp) + if v, ok := m[ts]; ok && v && ((len(list) != 0 && ts != list[len(list) - 1]) || len(list) == 0) { + list = append(list, ts) + } + } + } + } + rst++ + } + return 0 +} diff --git a/go/130-Surrounded-Regions.go b/go/130-Surrounded-Regions.go new file mode 100644 index 000000000..cadd00f63 --- /dev/null +++ b/go/130-Surrounded-Regions.go @@ -0,0 +1,60 @@ +func solve(board [][]byte) { + n := len(board) + m := len(board[0]) + + // If board have less than 3 size in any direction: nothing to do, because all cells located on borders + if n < 3 || m < 3 { + return + } + + // Go and check left and right borders of the board + for row := 0; row < n; row++ { + if board[row][0] == 'O' { + dfs(row, 0, n, m, board) + } + if board[row][m - 1] == 'O' { + dfs(row, m - 1, n, m, board) + } + } + + // Same for check up and down borders of the board + // Since corners (0,0) and (n - 1, m - 1) where checked in previous cycle, skip them in this one + for col := 1; col < m - 1; col++ { + if board[0][col] == 'O' { + dfs(0, col, n, m, board) + } + if board[n - 1][col] == 'O' { + dfs(n - 1, col, n, m, board) + } + } + + // Follow through the whole board and flip all 'R' cells back into 'O' and all 'O' cell to 'X' + // since they're unreacheable from the board located 'O' cell if any + for row := 0; row < n; row++ { + for col := 0; col < m; col++ { + if board[row][col] == 'O' { + board[row][col] = 'X' + } else if board[row][col] == 'R' { + board[row][col] = 'O' + } + } + } +} + +// DFS to look for the next 'O' cell upper, lower, to the right and to the left of current coordinates +// If 'O' cell is found, recursevly mark this cell as 'R' which is mean REACHED +func dfs(row int, col int, n int, m int, board [][]byte) { + board[row][col] = 'R' + if row > 0 && board[row - 1][col] == 'O' { + dfs(row - 1, col, n, m, board) + } + if row < n - 1 && board[row + 1][col] == 'O' { + dfs(row + 1, col, n, m, board) + } + if col > 0 && board[row][col - 1] == 'O' { + dfs(row, col - 1, n, m, board) + } + if col < m - 1 && board[row][col + 1] == 'O' { + dfs(row, col + 1, n, m, board) + } +} \ No newline at end of file diff --git a/go/139-WordBreak.go b/go/139-WordBreak.go new file mode 100644 index 000000000..b42ed396b --- /dev/null +++ b/go/139-WordBreak.go @@ -0,0 +1,22 @@ +func wordBreak(s string, wordDict []string) bool { + dp := make([]bool, len(s) + 1) + dp[0] = true + + for i := range s { + if !dp[i] { + continue + } + + for _, word := range wordDict { + if i + len(word) > len(s) { + continue + } + + if s[i:i+len(word)] == word { + dp[i+len(word)] = true + } + } + } + + return dp[len(s)] +} \ No newline at end of file diff --git a/go/152-MaximumProductSubarray.go b/go/152-MaximumProductSubarray.go new file mode 100644 index 000000000..c0cc8e671 --- /dev/null +++ b/go/152-MaximumProductSubarray.go @@ -0,0 +1,29 @@ +func maxProduct(nums []int) int { + tmpMin, tmpMax, ans := nums[0], nums[0], nums[0] + + for i := 1; i < len(nums);i++{ + tmpMin, tmpMax = + min(nums[i], min(nums[i]*tmpMax, nums[i]*tmpMin)), + max(nums[i], max(nums[i]*tmpMax, nums[i]*tmpMin)) + ans = max(ans, tmpMax) + } + + + return ans +} + +func max(a,b int)int{ + if a < b{ + return b + } + + return a +} + +func min(a,b int)int{ + if a > b{ + return b + } + + return a +} \ No newline at end of file diff --git a/go/207-CourseSchedule.go b/go/207-CourseSchedule.go new file mode 100644 index 000000000..492aa3a4b --- /dev/null +++ b/go/207-CourseSchedule.go @@ -0,0 +1,42 @@ +func canFinish(numCourses int, prerequisites [][]int) bool { + visited := map[int]bool{} + adjList, indegree := getMaps(prerequisites) + + + q := []int{} + for i := 0; i < numCourses; i++ { + if indegree[i] == 0 { + q = append(q, i) + } + } + + for len(q) > 0 { + course := q[0] // top + q = q[1:] + + visited[course] = true + for _, conn := range adjList[course] { + indegree[conn]-- + + if indegree[conn] == 0 && !visited[conn] { + q = append(q, conn) + delete(indegree, conn) + } + } + } + + return len(indegree) == 0 +} + +func getMaps(edges [][]int) (map[int][]int, map[int]int) { + adjList := map[int][]int{} + indegree := map[int]int{} + + for _, edge := range edges { + s, e := edge[1], edge[0] + adjList[s] = append(adjList[s], e) + + indegree[e]++ + } + return adjList, indegree +} \ No newline at end of file diff --git a/go/210-Course_Schedule_II.go b/go/210-Course_Schedule_II.go new file mode 100644 index 000000000..929f49715 --- /dev/null +++ b/go/210-Course_Schedule_II.go @@ -0,0 +1,51 @@ +func findOrder(numCourses int, prerequisites [][]int) []int { + graph, incomings := buildMap(numCourses, prerequisites) + + var starts []int + for i, incoming := range incomings { + if incoming == 0 { + starts = append(starts, i) + } + } + + var res []int + var visitNum int + for _, start := range starts { + queue := []int{start} + res = append(res, start) + visitNum += 1 + for len(queue) > 0 { + node := queue[0] + queue = queue[1:] + neighbors, ok := graph[node] + if ok { + for _, neighbor := range neighbors { + incomings[neighbor] -= 1 + if incomings[neighbor] == 0 { + queue = append(queue, neighbor) + res = append(res, neighbor) + visitNum += 1 + } + } + } + } + } + if visitNum == numCourses { + return res + } + return []int{} +} + +func buildMap(numCourses int, prerequisites [][]int) (map[int][]int, []int) { + graph := make(map[int][]int) + incomings := make([]int, numCourses) + for _, preq := range prerequisites { + if _, ok := graph[preq[1]]; !ok { + graph[preq[1]] = []int{preq[0]} + } else { + graph[preq[1]] = append(graph[preq[1]], preq[0]) + } + incomings[preq[0]] += 1 + } + return graph, incomings +} \ No newline at end of file diff --git a/go/261-GraphValidTree.go b/go/261-GraphValidTree.go new file mode 100644 index 000000000..0b073fa76 --- /dev/null +++ b/go/261-GraphValidTree.go @@ -0,0 +1,28 @@ +func validTree(n int, edges [][]int) bool { + if len(edges) != n-1 { + return false + } + + seen := make(map[int]bool) + g := make(map[int][]int) + + for _, edge := range edges { + g[edge[0]] = append(g[edge[0]], edge[1]) + g[edge[1]] = append(g[edge[1]], edge[0]) + } + + dfs(0, seen, g) + + return len(seen) == n +} + +func dfs(u int, seen map[int]bool, g map[int][]int) { + if _, ok := seen[u]; ok { + return + } + seen[u] = true + + for _, v := range g[u] { + dfs(v, seen, g) + } +} \ No newline at end of file diff --git a/go/286-WallsAndGates.go b/go/286-WallsAndGates.go new file mode 100644 index 000000000..f5ce21eb8 --- /dev/null +++ b/go/286-WallsAndGates.go @@ -0,0 +1,53 @@ +import "math" + +const ( + empty = math.MaxInt32 + gate = 0 +) + +var directions = [4][2]int{ + {1, 0}, + {-1, 0}, + {0, 1}, + {0, -1}, +} + +func wallsAndGates(rooms [][]int) { + if len(rooms) == 0 || len(rooms[0]) == 0 { + return + } + + queue := findGatesCoordinates(rooms) + + rowLength, columnLength := len(rooms), len(rooms[0]) + + for len(queue) > 0 { + coordinates := queue[0] + queue = queue[1:] + row, col := coordinates[0], coordinates[1] + + for _, direction := range directions { + currentRow := row + direction[0] + currentCol := col + direction[1] + isOutOfBounds := currentRow < 0 || currentCol < 0 || currentRow >= rowLength || currentCol >= columnLength + + if !isOutOfBounds && rooms[currentRow][currentCol] == empty { + rooms[currentRow][currentCol] = rooms[row][col] + 1 + queue = append(queue, []int{currentRow, currentCol}) + } + } + } +} + +func findGatesCoordinates(rooms [][]int) [][]int { + queue := [][]int{} + for row := range rooms { + for col := range rooms[row] { + if rooms[row][col] == gate { + queue = append(queue, []int{row, col}) + } + } + } + + return queue +} \ No newline at end of file diff --git a/go/322-CoinChange.go b/go/322-CoinChange.go new file mode 100644 index 000000000..a0dfc3fed --- /dev/null +++ b/go/322-CoinChange.go @@ -0,0 +1,57 @@ +func min(x, y int) int { + + if x < y { + return x + }else{ + return y + } +} + +func coinChange(coins []int, amount int) int { + + INF := 65535 + size := amount+1 + + // idx: money + // value: minimal change count + change := make([]int, size) + + + // Initialized to infinity + for idx, _ := range change{ + change[idx] = INF + } + + // Initialization for $0 + change[0] = 0 + + + + for value := 1; value <= amount; value += 1{ + + for _, coin := range coins{ + + if coin > value{ + + // coin value is to big, can not make change with current coin + continue + } + + // update dp_table, try to make change with coin + change[value] = min(change[value-coin]+1, change[value]) + } + } + + if change[amount] == INF{ + + // Reject, no solution + return -1 + + } else{ + + // Accept, return total count of coin change + return change[amount] + } + + +} \ No newline at end of file diff --git a/go/323-NumberOfConnectedComponentsUndirectedGraph.go b/go/323-NumberOfConnectedComponentsUndirectedGraph.go new file mode 100644 index 000000000..c39bb83fe --- /dev/null +++ b/go/323-NumberOfConnectedComponentsUndirectedGraph.go @@ -0,0 +1,34 @@ +func countComponents(n int, edges [][]int) int { + var parent []int + + for i:=0; i< n; i++ { + parent = append(parent, -1) + } + + // current number disjoint sets + count := n + for i:=0; i< len(edges); i++ { + x := findParent(edges[i][0], &parent) + y := findParent(edges[i][1], &parent) + + if x == y && x >= 0 { + continue + } else { + parent[x] = y + count-- // decreasing count of disjoint sets as two diff components gets connected + } + } + + return count +} + + +func findParent(i int, parent *[]int) int { + if (*parent)[i] == -1 { + return i + } + + (*parent)[i] = findParent((*parent)[i], parent) + + return (*parent)[i] +} \ No newline at end of file diff --git a/go/684-RedundantConnection.go b/go/684-RedundantConnection.go new file mode 100644 index 000000000..70e595f4e --- /dev/null +++ b/go/684-RedundantConnection.go @@ -0,0 +1,31 @@ +func findRedundantConnection(edges [][]int) []int { + var res []int + node:=make(map[int][]int) + for _,v := range edges{ + visit:=make(map[int]int) + visit[v[0]]=1 + if isCircle(node, v[1],v[0],visit){ + return v + } + node[v[0]]=append(node[v[0]],v[1]) + node[v[1]]=append(node[v[1]],v[0]) + } + return res +} + +func isCircle(m map[int][]int, cur, prev int, visit map[int]int) bool { + var res bool + for _,v := range m[cur]{ + if v==prev{ + continue + } + visit[v]+=1 + if visit[v] >1{ + return true + } + if isCircle(m,v,cur,visit) { + return true + } + } + return res +} \ No newline at end of file diff --git a/go/91-DecodeWays.go b/go/91-DecodeWays.go new file mode 100644 index 000000000..898b87c25 --- /dev/null +++ b/go/91-DecodeWays.go @@ -0,0 +1,44 @@ +func numDecodings(s string) int { + slen := len(s) + if slen == 0 { + return 0 + } + + dp := make([]int, slen) + if canDecode(s, 0, 1) { + dp[0] = 1 + } else { + dp[0] = 0 + } + + for i := 1; i < slen; i++ { + switch { + case canDecode(s, i, 1) && canDecode(s, i, 2): + prev := 1 + if i >= 2 { + prev = dp[i-2] + } + dp[i] = dp[i-1] + prev + case canDecode(s, i, 1) && !canDecode(s, i, 2): + dp[i] = dp[i-1] + case !canDecode(s, i, 1) && canDecode(s, i, 2): + prev := 1 + if i >= 2 { + prev = dp[i-2] + } + dp[i] = prev + default: // decoding gets stuck here :-/ + return 0 + } + } + return dp[slen-1] +} + +func canDecode(s string, i int, l int) bool { + if l == 1 { + return s[i] > '0' && s[i] <= '9' + } else if l == 2 { + return s[i-1:i+1] >= "10" && s[i-1:i+1] <= "26" + } + return false +} \ No newline at end of file diff --git a/go/994-RottingOranges.go b/go/994-RottingOranges.go new file mode 100644 index 000000000..459729478 --- /dev/null +++ b/go/994-RottingOranges.go @@ -0,0 +1,61 @@ +func orangesRotting(grid [][]int) int { + // queue for BFS + q := make([][3]int, 0, (len(grid) * len(grid[0]) * len(grid) * len(grid[0]))) + + for row := 0; row < len(grid); row++ { + for col := 0; col < len(grid[0]); col++ { + // If cell isn't a rotten one: nothing interestring here + if grid[row][col] < 2 { + continue + } + // But if we found rotten one, contamination begins =) + q = append(q, [3]int{row, col, 0}) + for len(q) > 0 { + // This is BFS cycle. Look for up, down, left and right neighbours and if they are suitable for contamination. + // If suitable: add them to the queue + r, c, distance := q[len(q) - 1][0], q[len(q) - 1][1], q[len(q) - 1][2] + q = q[:len(q) - 1] + if grid[r][c] < 0 && grid[r][c] > distance { + continue + } + // If this cell was already updated with shorter distance: skip it. + grid[r][c] = distance + // Check if upper element exists and if it is fresh apple + if r > 0 && (grid[r - 1][c] == 1 || grid[r - 1][c] < distance - 1) { + q = append(q, [3]int{r - 1, c, distance - 1}) + } + // Check if lower element exists and if it is fresh apple + if r < len(grid) - 1 && (grid[r + 1][c] == 1 || grid[r + 1][c] < distance - 1) { + q = append(q, [3]int{r + 1, c, distance - 1}) + } + // Check if left element exists and if it is fresh apple + if c > 0 && (grid[r][c - 1] == 1 || grid[r][c - 1] < distance - 1) { + q = append(q, [3]int{r, c - 1, distance - 1}) + } + // Check if right element exists and if it is fresh apple + if c < len(grid[0]) - 1 && (grid[r][c + 1] == 1 || grid[r][c + 1] < distance - 1) { + q = append(q, [3]int{r, c + 1, distance - 1}) + } + + } + } + } + maxDistance := 0 + for row := 0; row < len(grid); row++ { + for col := 0; col < len(grid[0]); col++ { + switch grid[row][col] { + case 0: + continue + case 1: + // If there is still untouched fresh apple cell, this cell is inaccesible from any rotten cells + // and our little contamination fails =( + return -1 + default: + if maxDistance > grid[row][col] { + maxDistance = grid[row][col] + } + } + } + } + return -maxDistance +} \ No newline at end of file From 17d2bf9eeeb75492a931c07f47bffea2f8f4f14b Mon Sep 17 00:00:00 2001 From: manojkumar1053 Date: Fri, 8 Jul 2022 21:48:15 +0000 Subject: [PATCH 2/4] Go Solutions --- go/417-PacificAtlanticWaterFlow.go | 73 ++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 go/417-PacificAtlanticWaterFlow.go diff --git a/go/417-PacificAtlanticWaterFlow.go b/go/417-PacificAtlanticWaterFlow.go new file mode 100644 index 000000000..8da28ef19 --- /dev/null +++ b/go/417-PacificAtlanticWaterFlow.go @@ -0,0 +1,73 @@ +func pacificAtlantic(matrix [][]int) [][]int { + coordinate := [][]int{} + if len(matrix) == 0 || len(matrix[0]) == 0 { + return coordinate + } + // feet: + // -1: no feet + // 0: pacific × atlantic × + // 1: pacific √ atlantic × + // 2: pacific × atlantic √ + // 3: pacific √ atlantic √ + feet := make([][]int, len(matrix)) + for i := range feet { + feet[i] = make([]int, len(matrix[i])) + } + for i := range feet { + for j := range feet[i] { + feet[i][j] = -1 + } + } + for i, vs := range matrix { + for j, v := range vs { + if dfs(matrix, feet, i, j, v) == 3 { + coordinate = append(coordinate, []int{i, j}) + } + } + } + return coordinate +} + +func dfs(matrix [][]int, feet [][]int, i, j, l int) int { + if i < 0 || j < 0 { + return 1 + } + if i >= len(matrix) || j >= len(matrix[0]) { + return 2 + } + // can't flow here + if matrix[i][j] > l { + return 0 + } + // already reach here, just return flow result + if feet[i][j] >= 0 { + return feet[i][j] + } + // mark reached + feet[i][j] = 0 + feet[i][j] = dfs(matrix, feet, i-1, j, matrix[i][j]) | dfs(matrix, feet, i+1, j, matrix[i][j]) | + dfs(matrix, feet, i, j-1, matrix[i][j]) | dfs(matrix, feet, i, j+1, matrix[i][j]) + dyeing(matrix, feet, i-1, j, matrix[i][j], feet[i][j]) + dyeing(matrix, feet, i+1, j, matrix[i][j], feet[i][j]) + dyeing(matrix, feet, i, j-1, matrix[i][j], feet[i][j]) + dyeing(matrix, feet, i, j+1, matrix[i][j], feet[i][j]) + return feet[i][j] +} + +// set same height same value +func dyeing(matrix [][]int, feet [][]int, i, j, l, c int) { + if i < 0 || j < 0 || i >= len(matrix) || j >= len(matrix[0]) { + return + } + if matrix[i][j] != l { + return + } + if feet[i][j] == c { + return + } + feet[i][j] = c + dyeing(matrix, feet, i-1, j, l, c) + dyeing(matrix, feet, i+1, j, l, c) + dyeing(matrix, feet, i, j-1, l, c) + dyeing(matrix, feet, i, j+1, l, c) +} \ No newline at end of file From 944d186d8fcec5fc28c673ca86ac3bdd41a25fa0 Mon Sep 17 00:00:00 2001 From: Manoj Kumar Date: Thu, 28 Jul 2022 01:27:41 +0000 Subject: [PATCH 3/4] reanmed files and changed to code to improve execution time --- go/127-Word-Ladder.go | 51 +++++++++++++ go/139-Word-Break.go | 22 ++++++ go/152-Maximum-Product-Subarray.go | 29 ++++++++ go/207-Course-Schedule.go | 42 +++++++++++ go/210-Course-Schedule-II.go | 51 +++++++++++++ go/261-Graph-Valid-Tree.go | 28 +++++++ go/286-Walls-And-Gates.go | 53 ++++++++++++++ go/322-Coin-Change.go | 57 +++++++++++++++ ...f-Connected-Components-Undirected-Graph.go | 34 +++++++++ go/417-Pacific-Atlantic-Water-Flow.go | 73 +++++++++++++++++++ go/684-Redundant-Connection.go | 31 ++++++++ go/91-Decode-Ways.go | 44 +++++++++++ go/994-Rotting-Oranges.go | 61 ++++++++++++++++ 13 files changed, 576 insertions(+) create mode 100644 go/127-Word-Ladder.go create mode 100644 go/139-Word-Break.go create mode 100644 go/152-Maximum-Product-Subarray.go create mode 100644 go/207-Course-Schedule.go create mode 100644 go/210-Course-Schedule-II.go create mode 100644 go/261-Graph-Valid-Tree.go create mode 100644 go/286-Walls-And-Gates.go create mode 100644 go/322-Coin-Change.go create mode 100644 go/323-Number-Of-Connected-Components-Undirected-Graph.go create mode 100644 go/417-Pacific-Atlantic-Water-Flow.go create mode 100644 go/684-Redundant-Connection.go create mode 100644 go/91-Decode-Ways.go create mode 100644 go/994-Rotting-Oranges.go diff --git a/go/127-Word-Ladder.go b/go/127-Word-Ladder.go new file mode 100644 index 000000000..677159c4d --- /dev/null +++ b/go/127-Word-Ladder.go @@ -0,0 +1,51 @@ +func ladderLength(beginWord string, endWord string, wordList []string) int { + wordMap := getWordMap(wordList, beginWord) + que := []string{beginWord} + depth := 0 + for len(que) > 0 { + depth++ + + qlen := len(que) + for i := 0; i < qlen; i++ { + word := que[0] + que = que[1:] + + candidates := getCandidates(word) + for _, candidate := range candidates { + if _, ok := wordMap[candidate]; ok { + if candidate == endWord { + return depth + 1 + } + + delete(wordMap, candidate) + que = append(que, candidate) + } + } + } + } + return 0 +} + +func getWordMap(wordList []string, beginWord string) map[string]int { + wordMap := make(map[string]int) + for i, word := range wordList { + if _, ok := wordMap[word]; !ok { + if word != beginWord { + wordMap[word] = i + } + } + } + return wordMap +} + +func getCandidates(word string) []string { + var res []string + for i := 0; i < 26; i++ { + for j := 0; j < len(word); j++ { + if word[j] != byte(int('a')+i) { + res = append(res, word[:j]+string(int('a')+i)+word[j+1:]) + } + } + } + return res +} \ No newline at end of file diff --git a/go/139-Word-Break.go b/go/139-Word-Break.go new file mode 100644 index 000000000..b42ed396b --- /dev/null +++ b/go/139-Word-Break.go @@ -0,0 +1,22 @@ +func wordBreak(s string, wordDict []string) bool { + dp := make([]bool, len(s) + 1) + dp[0] = true + + for i := range s { + if !dp[i] { + continue + } + + for _, word := range wordDict { + if i + len(word) > len(s) { + continue + } + + if s[i:i+len(word)] == word { + dp[i+len(word)] = true + } + } + } + + return dp[len(s)] +} \ No newline at end of file diff --git a/go/152-Maximum-Product-Subarray.go b/go/152-Maximum-Product-Subarray.go new file mode 100644 index 000000000..c0cc8e671 --- /dev/null +++ b/go/152-Maximum-Product-Subarray.go @@ -0,0 +1,29 @@ +func maxProduct(nums []int) int { + tmpMin, tmpMax, ans := nums[0], nums[0], nums[0] + + for i := 1; i < len(nums);i++{ + tmpMin, tmpMax = + min(nums[i], min(nums[i]*tmpMax, nums[i]*tmpMin)), + max(nums[i], max(nums[i]*tmpMax, nums[i]*tmpMin)) + ans = max(ans, tmpMax) + } + + + return ans +} + +func max(a,b int)int{ + if a < b{ + return b + } + + return a +} + +func min(a,b int)int{ + if a > b{ + return b + } + + return a +} \ No newline at end of file diff --git a/go/207-Course-Schedule.go b/go/207-Course-Schedule.go new file mode 100644 index 000000000..492aa3a4b --- /dev/null +++ b/go/207-Course-Schedule.go @@ -0,0 +1,42 @@ +func canFinish(numCourses int, prerequisites [][]int) bool { + visited := map[int]bool{} + adjList, indegree := getMaps(prerequisites) + + + q := []int{} + for i := 0; i < numCourses; i++ { + if indegree[i] == 0 { + q = append(q, i) + } + } + + for len(q) > 0 { + course := q[0] // top + q = q[1:] + + visited[course] = true + for _, conn := range adjList[course] { + indegree[conn]-- + + if indegree[conn] == 0 && !visited[conn] { + q = append(q, conn) + delete(indegree, conn) + } + } + } + + return len(indegree) == 0 +} + +func getMaps(edges [][]int) (map[int][]int, map[int]int) { + adjList := map[int][]int{} + indegree := map[int]int{} + + for _, edge := range edges { + s, e := edge[1], edge[0] + adjList[s] = append(adjList[s], e) + + indegree[e]++ + } + return adjList, indegree +} \ No newline at end of file diff --git a/go/210-Course-Schedule-II.go b/go/210-Course-Schedule-II.go new file mode 100644 index 000000000..929f49715 --- /dev/null +++ b/go/210-Course-Schedule-II.go @@ -0,0 +1,51 @@ +func findOrder(numCourses int, prerequisites [][]int) []int { + graph, incomings := buildMap(numCourses, prerequisites) + + var starts []int + for i, incoming := range incomings { + if incoming == 0 { + starts = append(starts, i) + } + } + + var res []int + var visitNum int + for _, start := range starts { + queue := []int{start} + res = append(res, start) + visitNum += 1 + for len(queue) > 0 { + node := queue[0] + queue = queue[1:] + neighbors, ok := graph[node] + if ok { + for _, neighbor := range neighbors { + incomings[neighbor] -= 1 + if incomings[neighbor] == 0 { + queue = append(queue, neighbor) + res = append(res, neighbor) + visitNum += 1 + } + } + } + } + } + if visitNum == numCourses { + return res + } + return []int{} +} + +func buildMap(numCourses int, prerequisites [][]int) (map[int][]int, []int) { + graph := make(map[int][]int) + incomings := make([]int, numCourses) + for _, preq := range prerequisites { + if _, ok := graph[preq[1]]; !ok { + graph[preq[1]] = []int{preq[0]} + } else { + graph[preq[1]] = append(graph[preq[1]], preq[0]) + } + incomings[preq[0]] += 1 + } + return graph, incomings +} \ No newline at end of file diff --git a/go/261-Graph-Valid-Tree.go b/go/261-Graph-Valid-Tree.go new file mode 100644 index 000000000..0b073fa76 --- /dev/null +++ b/go/261-Graph-Valid-Tree.go @@ -0,0 +1,28 @@ +func validTree(n int, edges [][]int) bool { + if len(edges) != n-1 { + return false + } + + seen := make(map[int]bool) + g := make(map[int][]int) + + for _, edge := range edges { + g[edge[0]] = append(g[edge[0]], edge[1]) + g[edge[1]] = append(g[edge[1]], edge[0]) + } + + dfs(0, seen, g) + + return len(seen) == n +} + +func dfs(u int, seen map[int]bool, g map[int][]int) { + if _, ok := seen[u]; ok { + return + } + seen[u] = true + + for _, v := range g[u] { + dfs(v, seen, g) + } +} \ No newline at end of file diff --git a/go/286-Walls-And-Gates.go b/go/286-Walls-And-Gates.go new file mode 100644 index 000000000..f5ce21eb8 --- /dev/null +++ b/go/286-Walls-And-Gates.go @@ -0,0 +1,53 @@ +import "math" + +const ( + empty = math.MaxInt32 + gate = 0 +) + +var directions = [4][2]int{ + {1, 0}, + {-1, 0}, + {0, 1}, + {0, -1}, +} + +func wallsAndGates(rooms [][]int) { + if len(rooms) == 0 || len(rooms[0]) == 0 { + return + } + + queue := findGatesCoordinates(rooms) + + rowLength, columnLength := len(rooms), len(rooms[0]) + + for len(queue) > 0 { + coordinates := queue[0] + queue = queue[1:] + row, col := coordinates[0], coordinates[1] + + for _, direction := range directions { + currentRow := row + direction[0] + currentCol := col + direction[1] + isOutOfBounds := currentRow < 0 || currentCol < 0 || currentRow >= rowLength || currentCol >= columnLength + + if !isOutOfBounds && rooms[currentRow][currentCol] == empty { + rooms[currentRow][currentCol] = rooms[row][col] + 1 + queue = append(queue, []int{currentRow, currentCol}) + } + } + } +} + +func findGatesCoordinates(rooms [][]int) [][]int { + queue := [][]int{} + for row := range rooms { + for col := range rooms[row] { + if rooms[row][col] == gate { + queue = append(queue, []int{row, col}) + } + } + } + + return queue +} \ No newline at end of file diff --git a/go/322-Coin-Change.go b/go/322-Coin-Change.go new file mode 100644 index 000000000..a0dfc3fed --- /dev/null +++ b/go/322-Coin-Change.go @@ -0,0 +1,57 @@ +func min(x, y int) int { + + if x < y { + return x + }else{ + return y + } +} + +func coinChange(coins []int, amount int) int { + + INF := 65535 + size := amount+1 + + // idx: money + // value: minimal change count + change := make([]int, size) + + + // Initialized to infinity + for idx, _ := range change{ + change[idx] = INF + } + + // Initialization for $0 + change[0] = 0 + + + + for value := 1; value <= amount; value += 1{ + + for _, coin := range coins{ + + if coin > value{ + + // coin value is to big, can not make change with current coin + continue + } + + // update dp_table, try to make change with coin + change[value] = min(change[value-coin]+1, change[value]) + } + } + + if change[amount] == INF{ + + // Reject, no solution + return -1 + + } else{ + + // Accept, return total count of coin change + return change[amount] + } + + +} \ No newline at end of file diff --git a/go/323-Number-Of-Connected-Components-Undirected-Graph.go b/go/323-Number-Of-Connected-Components-Undirected-Graph.go new file mode 100644 index 000000000..c39bb83fe --- /dev/null +++ b/go/323-Number-Of-Connected-Components-Undirected-Graph.go @@ -0,0 +1,34 @@ +func countComponents(n int, edges [][]int) int { + var parent []int + + for i:=0; i< n; i++ { + parent = append(parent, -1) + } + + // current number disjoint sets + count := n + for i:=0; i< len(edges); i++ { + x := findParent(edges[i][0], &parent) + y := findParent(edges[i][1], &parent) + + if x == y && x >= 0 { + continue + } else { + parent[x] = y + count-- // decreasing count of disjoint sets as two diff components gets connected + } + } + + return count +} + + +func findParent(i int, parent *[]int) int { + if (*parent)[i] == -1 { + return i + } + + (*parent)[i] = findParent((*parent)[i], parent) + + return (*parent)[i] +} \ No newline at end of file diff --git a/go/417-Pacific-Atlantic-Water-Flow.go b/go/417-Pacific-Atlantic-Water-Flow.go new file mode 100644 index 000000000..8da28ef19 --- /dev/null +++ b/go/417-Pacific-Atlantic-Water-Flow.go @@ -0,0 +1,73 @@ +func pacificAtlantic(matrix [][]int) [][]int { + coordinate := [][]int{} + if len(matrix) == 0 || len(matrix[0]) == 0 { + return coordinate + } + // feet: + // -1: no feet + // 0: pacific × atlantic × + // 1: pacific √ atlantic × + // 2: pacific × atlantic √ + // 3: pacific √ atlantic √ + feet := make([][]int, len(matrix)) + for i := range feet { + feet[i] = make([]int, len(matrix[i])) + } + for i := range feet { + for j := range feet[i] { + feet[i][j] = -1 + } + } + for i, vs := range matrix { + for j, v := range vs { + if dfs(matrix, feet, i, j, v) == 3 { + coordinate = append(coordinate, []int{i, j}) + } + } + } + return coordinate +} + +func dfs(matrix [][]int, feet [][]int, i, j, l int) int { + if i < 0 || j < 0 { + return 1 + } + if i >= len(matrix) || j >= len(matrix[0]) { + return 2 + } + // can't flow here + if matrix[i][j] > l { + return 0 + } + // already reach here, just return flow result + if feet[i][j] >= 0 { + return feet[i][j] + } + // mark reached + feet[i][j] = 0 + feet[i][j] = dfs(matrix, feet, i-1, j, matrix[i][j]) | dfs(matrix, feet, i+1, j, matrix[i][j]) | + dfs(matrix, feet, i, j-1, matrix[i][j]) | dfs(matrix, feet, i, j+1, matrix[i][j]) + dyeing(matrix, feet, i-1, j, matrix[i][j], feet[i][j]) + dyeing(matrix, feet, i+1, j, matrix[i][j], feet[i][j]) + dyeing(matrix, feet, i, j-1, matrix[i][j], feet[i][j]) + dyeing(matrix, feet, i, j+1, matrix[i][j], feet[i][j]) + return feet[i][j] +} + +// set same height same value +func dyeing(matrix [][]int, feet [][]int, i, j, l, c int) { + if i < 0 || j < 0 || i >= len(matrix) || j >= len(matrix[0]) { + return + } + if matrix[i][j] != l { + return + } + if feet[i][j] == c { + return + } + feet[i][j] = c + dyeing(matrix, feet, i-1, j, l, c) + dyeing(matrix, feet, i+1, j, l, c) + dyeing(matrix, feet, i, j-1, l, c) + dyeing(matrix, feet, i, j+1, l, c) +} \ No newline at end of file diff --git a/go/684-Redundant-Connection.go b/go/684-Redundant-Connection.go new file mode 100644 index 000000000..70e595f4e --- /dev/null +++ b/go/684-Redundant-Connection.go @@ -0,0 +1,31 @@ +func findRedundantConnection(edges [][]int) []int { + var res []int + node:=make(map[int][]int) + for _,v := range edges{ + visit:=make(map[int]int) + visit[v[0]]=1 + if isCircle(node, v[1],v[0],visit){ + return v + } + node[v[0]]=append(node[v[0]],v[1]) + node[v[1]]=append(node[v[1]],v[0]) + } + return res +} + +func isCircle(m map[int][]int, cur, prev int, visit map[int]int) bool { + var res bool + for _,v := range m[cur]{ + if v==prev{ + continue + } + visit[v]+=1 + if visit[v] >1{ + return true + } + if isCircle(m,v,cur,visit) { + return true + } + } + return res +} \ No newline at end of file diff --git a/go/91-Decode-Ways.go b/go/91-Decode-Ways.go new file mode 100644 index 000000000..898b87c25 --- /dev/null +++ b/go/91-Decode-Ways.go @@ -0,0 +1,44 @@ +func numDecodings(s string) int { + slen := len(s) + if slen == 0 { + return 0 + } + + dp := make([]int, slen) + if canDecode(s, 0, 1) { + dp[0] = 1 + } else { + dp[0] = 0 + } + + for i := 1; i < slen; i++ { + switch { + case canDecode(s, i, 1) && canDecode(s, i, 2): + prev := 1 + if i >= 2 { + prev = dp[i-2] + } + dp[i] = dp[i-1] + prev + case canDecode(s, i, 1) && !canDecode(s, i, 2): + dp[i] = dp[i-1] + case !canDecode(s, i, 1) && canDecode(s, i, 2): + prev := 1 + if i >= 2 { + prev = dp[i-2] + } + dp[i] = prev + default: // decoding gets stuck here :-/ + return 0 + } + } + return dp[slen-1] +} + +func canDecode(s string, i int, l int) bool { + if l == 1 { + return s[i] > '0' && s[i] <= '9' + } else if l == 2 { + return s[i-1:i+1] >= "10" && s[i-1:i+1] <= "26" + } + return false +} \ No newline at end of file diff --git a/go/994-Rotting-Oranges.go b/go/994-Rotting-Oranges.go new file mode 100644 index 000000000..459729478 --- /dev/null +++ b/go/994-Rotting-Oranges.go @@ -0,0 +1,61 @@ +func orangesRotting(grid [][]int) int { + // queue for BFS + q := make([][3]int, 0, (len(grid) * len(grid[0]) * len(grid) * len(grid[0]))) + + for row := 0; row < len(grid); row++ { + for col := 0; col < len(grid[0]); col++ { + // If cell isn't a rotten one: nothing interestring here + if grid[row][col] < 2 { + continue + } + // But if we found rotten one, contamination begins =) + q = append(q, [3]int{row, col, 0}) + for len(q) > 0 { + // This is BFS cycle. Look for up, down, left and right neighbours and if they are suitable for contamination. + // If suitable: add them to the queue + r, c, distance := q[len(q) - 1][0], q[len(q) - 1][1], q[len(q) - 1][2] + q = q[:len(q) - 1] + if grid[r][c] < 0 && grid[r][c] > distance { + continue + } + // If this cell was already updated with shorter distance: skip it. + grid[r][c] = distance + // Check if upper element exists and if it is fresh apple + if r > 0 && (grid[r - 1][c] == 1 || grid[r - 1][c] < distance - 1) { + q = append(q, [3]int{r - 1, c, distance - 1}) + } + // Check if lower element exists and if it is fresh apple + if r < len(grid) - 1 && (grid[r + 1][c] == 1 || grid[r + 1][c] < distance - 1) { + q = append(q, [3]int{r + 1, c, distance - 1}) + } + // Check if left element exists and if it is fresh apple + if c > 0 && (grid[r][c - 1] == 1 || grid[r][c - 1] < distance - 1) { + q = append(q, [3]int{r, c - 1, distance - 1}) + } + // Check if right element exists and if it is fresh apple + if c < len(grid[0]) - 1 && (grid[r][c + 1] == 1 || grid[r][c + 1] < distance - 1) { + q = append(q, [3]int{r, c + 1, distance - 1}) + } + + } + } + } + maxDistance := 0 + for row := 0; row < len(grid); row++ { + for col := 0; col < len(grid[0]); col++ { + switch grid[row][col] { + case 0: + continue + case 1: + // If there is still untouched fresh apple cell, this cell is inaccesible from any rotten cells + // and our little contamination fails =( + return -1 + default: + if maxDistance > grid[row][col] { + maxDistance = grid[row][col] + } + } + } + } + return -maxDistance +} \ No newline at end of file From d378020d0fe94208a20b21f1285ad3f0cb2b20c7 Mon Sep 17 00:00:00 2001 From: Manoj Kumar Date: Thu, 28 Jul 2022 01:28:22 +0000 Subject: [PATCH 4/4] reanmed files and changed to code to improve execution time --- go/127-wordLadder.go | 32 -------- go/139-WordBreak.go | 22 ------ go/152-MaximumProductSubarray.go | 29 -------- go/207-CourseSchedule.go | 42 ----------- go/210-Course_Schedule_II.go | 51 ------------- go/261-GraphValidTree.go | 28 ------- go/286-WallsAndGates.go | 53 -------------- go/322-CoinChange.go | 57 --------------- ...berOfConnectedComponentsUndirectedGraph.go | 34 --------- go/417-PacificAtlanticWaterFlow.go | 73 ------------------- go/684-RedundantConnection.go | 31 -------- go/91-DecodeWays.go | 44 ----------- go/994-RottingOranges.go | 61 ---------------- 13 files changed, 557 deletions(-) delete mode 100644 go/127-wordLadder.go delete mode 100644 go/139-WordBreak.go delete mode 100644 go/152-MaximumProductSubarray.go delete mode 100644 go/207-CourseSchedule.go delete mode 100644 go/210-Course_Schedule_II.go delete mode 100644 go/261-GraphValidTree.go delete mode 100644 go/286-WallsAndGates.go delete mode 100644 go/322-CoinChange.go delete mode 100644 go/323-NumberOfConnectedComponentsUndirectedGraph.go delete mode 100644 go/417-PacificAtlanticWaterFlow.go delete mode 100644 go/684-RedundantConnection.go delete mode 100644 go/91-DecodeWays.go delete mode 100644 go/994-RottingOranges.go diff --git a/go/127-wordLadder.go b/go/127-wordLadder.go deleted file mode 100644 index 44dffe766..000000000 --- a/go/127-wordLadder.go +++ /dev/null @@ -1,32 +0,0 @@ -func ladderLength(beginWord string, endWord string, wordList []string) int { - m := make(map[string]bool) - for _, v := range wordList { - m[v] = true - } - list := []string{} - list = append(list, beginWord) - rst := 1 - for len(list) != 0 { - l := len(list) - for i := 0; i < l; i ++ { - word := list[0] - list = list[1:] - if word == endWord { - return rst - } - m[word] = false - for i, _ := range word { - for j := 0; j < 26; j++ { - tmp := []rune(word) - tmp[i] = rune('a' + j) - ts := string(tmp) - if v, ok := m[ts]; ok && v && ((len(list) != 0 && ts != list[len(list) - 1]) || len(list) == 0) { - list = append(list, ts) - } - } - } - } - rst++ - } - return 0 -} diff --git a/go/139-WordBreak.go b/go/139-WordBreak.go deleted file mode 100644 index b42ed396b..000000000 --- a/go/139-WordBreak.go +++ /dev/null @@ -1,22 +0,0 @@ -func wordBreak(s string, wordDict []string) bool { - dp := make([]bool, len(s) + 1) - dp[0] = true - - for i := range s { - if !dp[i] { - continue - } - - for _, word := range wordDict { - if i + len(word) > len(s) { - continue - } - - if s[i:i+len(word)] == word { - dp[i+len(word)] = true - } - } - } - - return dp[len(s)] -} \ No newline at end of file diff --git a/go/152-MaximumProductSubarray.go b/go/152-MaximumProductSubarray.go deleted file mode 100644 index c0cc8e671..000000000 --- a/go/152-MaximumProductSubarray.go +++ /dev/null @@ -1,29 +0,0 @@ -func maxProduct(nums []int) int { - tmpMin, tmpMax, ans := nums[0], nums[0], nums[0] - - for i := 1; i < len(nums);i++{ - tmpMin, tmpMax = - min(nums[i], min(nums[i]*tmpMax, nums[i]*tmpMin)), - max(nums[i], max(nums[i]*tmpMax, nums[i]*tmpMin)) - ans = max(ans, tmpMax) - } - - - return ans -} - -func max(a,b int)int{ - if a < b{ - return b - } - - return a -} - -func min(a,b int)int{ - if a > b{ - return b - } - - return a -} \ No newline at end of file diff --git a/go/207-CourseSchedule.go b/go/207-CourseSchedule.go deleted file mode 100644 index 492aa3a4b..000000000 --- a/go/207-CourseSchedule.go +++ /dev/null @@ -1,42 +0,0 @@ -func canFinish(numCourses int, prerequisites [][]int) bool { - visited := map[int]bool{} - adjList, indegree := getMaps(prerequisites) - - - q := []int{} - for i := 0; i < numCourses; i++ { - if indegree[i] == 0 { - q = append(q, i) - } - } - - for len(q) > 0 { - course := q[0] // top - q = q[1:] - - visited[course] = true - for _, conn := range adjList[course] { - indegree[conn]-- - - if indegree[conn] == 0 && !visited[conn] { - q = append(q, conn) - delete(indegree, conn) - } - } - } - - return len(indegree) == 0 -} - -func getMaps(edges [][]int) (map[int][]int, map[int]int) { - adjList := map[int][]int{} - indegree := map[int]int{} - - for _, edge := range edges { - s, e := edge[1], edge[0] - adjList[s] = append(adjList[s], e) - - indegree[e]++ - } - return adjList, indegree -} \ No newline at end of file diff --git a/go/210-Course_Schedule_II.go b/go/210-Course_Schedule_II.go deleted file mode 100644 index 929f49715..000000000 --- a/go/210-Course_Schedule_II.go +++ /dev/null @@ -1,51 +0,0 @@ -func findOrder(numCourses int, prerequisites [][]int) []int { - graph, incomings := buildMap(numCourses, prerequisites) - - var starts []int - for i, incoming := range incomings { - if incoming == 0 { - starts = append(starts, i) - } - } - - var res []int - var visitNum int - for _, start := range starts { - queue := []int{start} - res = append(res, start) - visitNum += 1 - for len(queue) > 0 { - node := queue[0] - queue = queue[1:] - neighbors, ok := graph[node] - if ok { - for _, neighbor := range neighbors { - incomings[neighbor] -= 1 - if incomings[neighbor] == 0 { - queue = append(queue, neighbor) - res = append(res, neighbor) - visitNum += 1 - } - } - } - } - } - if visitNum == numCourses { - return res - } - return []int{} -} - -func buildMap(numCourses int, prerequisites [][]int) (map[int][]int, []int) { - graph := make(map[int][]int) - incomings := make([]int, numCourses) - for _, preq := range prerequisites { - if _, ok := graph[preq[1]]; !ok { - graph[preq[1]] = []int{preq[0]} - } else { - graph[preq[1]] = append(graph[preq[1]], preq[0]) - } - incomings[preq[0]] += 1 - } - return graph, incomings -} \ No newline at end of file diff --git a/go/261-GraphValidTree.go b/go/261-GraphValidTree.go deleted file mode 100644 index 0b073fa76..000000000 --- a/go/261-GraphValidTree.go +++ /dev/null @@ -1,28 +0,0 @@ -func validTree(n int, edges [][]int) bool { - if len(edges) != n-1 { - return false - } - - seen := make(map[int]bool) - g := make(map[int][]int) - - for _, edge := range edges { - g[edge[0]] = append(g[edge[0]], edge[1]) - g[edge[1]] = append(g[edge[1]], edge[0]) - } - - dfs(0, seen, g) - - return len(seen) == n -} - -func dfs(u int, seen map[int]bool, g map[int][]int) { - if _, ok := seen[u]; ok { - return - } - seen[u] = true - - for _, v := range g[u] { - dfs(v, seen, g) - } -} \ No newline at end of file diff --git a/go/286-WallsAndGates.go b/go/286-WallsAndGates.go deleted file mode 100644 index f5ce21eb8..000000000 --- a/go/286-WallsAndGates.go +++ /dev/null @@ -1,53 +0,0 @@ -import "math" - -const ( - empty = math.MaxInt32 - gate = 0 -) - -var directions = [4][2]int{ - {1, 0}, - {-1, 0}, - {0, 1}, - {0, -1}, -} - -func wallsAndGates(rooms [][]int) { - if len(rooms) == 0 || len(rooms[0]) == 0 { - return - } - - queue := findGatesCoordinates(rooms) - - rowLength, columnLength := len(rooms), len(rooms[0]) - - for len(queue) > 0 { - coordinates := queue[0] - queue = queue[1:] - row, col := coordinates[0], coordinates[1] - - for _, direction := range directions { - currentRow := row + direction[0] - currentCol := col + direction[1] - isOutOfBounds := currentRow < 0 || currentCol < 0 || currentRow >= rowLength || currentCol >= columnLength - - if !isOutOfBounds && rooms[currentRow][currentCol] == empty { - rooms[currentRow][currentCol] = rooms[row][col] + 1 - queue = append(queue, []int{currentRow, currentCol}) - } - } - } -} - -func findGatesCoordinates(rooms [][]int) [][]int { - queue := [][]int{} - for row := range rooms { - for col := range rooms[row] { - if rooms[row][col] == gate { - queue = append(queue, []int{row, col}) - } - } - } - - return queue -} \ No newline at end of file diff --git a/go/322-CoinChange.go b/go/322-CoinChange.go deleted file mode 100644 index a0dfc3fed..000000000 --- a/go/322-CoinChange.go +++ /dev/null @@ -1,57 +0,0 @@ -func min(x, y int) int { - - if x < y { - return x - }else{ - return y - } -} - -func coinChange(coins []int, amount int) int { - - INF := 65535 - size := amount+1 - - // idx: money - // value: minimal change count - change := make([]int, size) - - - // Initialized to infinity - for idx, _ := range change{ - change[idx] = INF - } - - // Initialization for $0 - change[0] = 0 - - - - for value := 1; value <= amount; value += 1{ - - for _, coin := range coins{ - - if coin > value{ - - // coin value is to big, can not make change with current coin - continue - } - - // update dp_table, try to make change with coin - change[value] = min(change[value-coin]+1, change[value]) - } - } - - if change[amount] == INF{ - - // Reject, no solution - return -1 - - } else{ - - // Accept, return total count of coin change - return change[amount] - } - - -} \ No newline at end of file diff --git a/go/323-NumberOfConnectedComponentsUndirectedGraph.go b/go/323-NumberOfConnectedComponentsUndirectedGraph.go deleted file mode 100644 index c39bb83fe..000000000 --- a/go/323-NumberOfConnectedComponentsUndirectedGraph.go +++ /dev/null @@ -1,34 +0,0 @@ -func countComponents(n int, edges [][]int) int { - var parent []int - - for i:=0; i< n; i++ { - parent = append(parent, -1) - } - - // current number disjoint sets - count := n - for i:=0; i< len(edges); i++ { - x := findParent(edges[i][0], &parent) - y := findParent(edges[i][1], &parent) - - if x == y && x >= 0 { - continue - } else { - parent[x] = y - count-- // decreasing count of disjoint sets as two diff components gets connected - } - } - - return count -} - - -func findParent(i int, parent *[]int) int { - if (*parent)[i] == -1 { - return i - } - - (*parent)[i] = findParent((*parent)[i], parent) - - return (*parent)[i] -} \ No newline at end of file diff --git a/go/417-PacificAtlanticWaterFlow.go b/go/417-PacificAtlanticWaterFlow.go deleted file mode 100644 index 8da28ef19..000000000 --- a/go/417-PacificAtlanticWaterFlow.go +++ /dev/null @@ -1,73 +0,0 @@ -func pacificAtlantic(matrix [][]int) [][]int { - coordinate := [][]int{} - if len(matrix) == 0 || len(matrix[0]) == 0 { - return coordinate - } - // feet: - // -1: no feet - // 0: pacific × atlantic × - // 1: pacific √ atlantic × - // 2: pacific × atlantic √ - // 3: pacific √ atlantic √ - feet := make([][]int, len(matrix)) - for i := range feet { - feet[i] = make([]int, len(matrix[i])) - } - for i := range feet { - for j := range feet[i] { - feet[i][j] = -1 - } - } - for i, vs := range matrix { - for j, v := range vs { - if dfs(matrix, feet, i, j, v) == 3 { - coordinate = append(coordinate, []int{i, j}) - } - } - } - return coordinate -} - -func dfs(matrix [][]int, feet [][]int, i, j, l int) int { - if i < 0 || j < 0 { - return 1 - } - if i >= len(matrix) || j >= len(matrix[0]) { - return 2 - } - // can't flow here - if matrix[i][j] > l { - return 0 - } - // already reach here, just return flow result - if feet[i][j] >= 0 { - return feet[i][j] - } - // mark reached - feet[i][j] = 0 - feet[i][j] = dfs(matrix, feet, i-1, j, matrix[i][j]) | dfs(matrix, feet, i+1, j, matrix[i][j]) | - dfs(matrix, feet, i, j-1, matrix[i][j]) | dfs(matrix, feet, i, j+1, matrix[i][j]) - dyeing(matrix, feet, i-1, j, matrix[i][j], feet[i][j]) - dyeing(matrix, feet, i+1, j, matrix[i][j], feet[i][j]) - dyeing(matrix, feet, i, j-1, matrix[i][j], feet[i][j]) - dyeing(matrix, feet, i, j+1, matrix[i][j], feet[i][j]) - return feet[i][j] -} - -// set same height same value -func dyeing(matrix [][]int, feet [][]int, i, j, l, c int) { - if i < 0 || j < 0 || i >= len(matrix) || j >= len(matrix[0]) { - return - } - if matrix[i][j] != l { - return - } - if feet[i][j] == c { - return - } - feet[i][j] = c - dyeing(matrix, feet, i-1, j, l, c) - dyeing(matrix, feet, i+1, j, l, c) - dyeing(matrix, feet, i, j-1, l, c) - dyeing(matrix, feet, i, j+1, l, c) -} \ No newline at end of file diff --git a/go/684-RedundantConnection.go b/go/684-RedundantConnection.go deleted file mode 100644 index 70e595f4e..000000000 --- a/go/684-RedundantConnection.go +++ /dev/null @@ -1,31 +0,0 @@ -func findRedundantConnection(edges [][]int) []int { - var res []int - node:=make(map[int][]int) - for _,v := range edges{ - visit:=make(map[int]int) - visit[v[0]]=1 - if isCircle(node, v[1],v[0],visit){ - return v - } - node[v[0]]=append(node[v[0]],v[1]) - node[v[1]]=append(node[v[1]],v[0]) - } - return res -} - -func isCircle(m map[int][]int, cur, prev int, visit map[int]int) bool { - var res bool - for _,v := range m[cur]{ - if v==prev{ - continue - } - visit[v]+=1 - if visit[v] >1{ - return true - } - if isCircle(m,v,cur,visit) { - return true - } - } - return res -} \ No newline at end of file diff --git a/go/91-DecodeWays.go b/go/91-DecodeWays.go deleted file mode 100644 index 898b87c25..000000000 --- a/go/91-DecodeWays.go +++ /dev/null @@ -1,44 +0,0 @@ -func numDecodings(s string) int { - slen := len(s) - if slen == 0 { - return 0 - } - - dp := make([]int, slen) - if canDecode(s, 0, 1) { - dp[0] = 1 - } else { - dp[0] = 0 - } - - for i := 1; i < slen; i++ { - switch { - case canDecode(s, i, 1) && canDecode(s, i, 2): - prev := 1 - if i >= 2 { - prev = dp[i-2] - } - dp[i] = dp[i-1] + prev - case canDecode(s, i, 1) && !canDecode(s, i, 2): - dp[i] = dp[i-1] - case !canDecode(s, i, 1) && canDecode(s, i, 2): - prev := 1 - if i >= 2 { - prev = dp[i-2] - } - dp[i] = prev - default: // decoding gets stuck here :-/ - return 0 - } - } - return dp[slen-1] -} - -func canDecode(s string, i int, l int) bool { - if l == 1 { - return s[i] > '0' && s[i] <= '9' - } else if l == 2 { - return s[i-1:i+1] >= "10" && s[i-1:i+1] <= "26" - } - return false -} \ No newline at end of file diff --git a/go/994-RottingOranges.go b/go/994-RottingOranges.go deleted file mode 100644 index 459729478..000000000 --- a/go/994-RottingOranges.go +++ /dev/null @@ -1,61 +0,0 @@ -func orangesRotting(grid [][]int) int { - // queue for BFS - q := make([][3]int, 0, (len(grid) * len(grid[0]) * len(grid) * len(grid[0]))) - - for row := 0; row < len(grid); row++ { - for col := 0; col < len(grid[0]); col++ { - // If cell isn't a rotten one: nothing interestring here - if grid[row][col] < 2 { - continue - } - // But if we found rotten one, contamination begins =) - q = append(q, [3]int{row, col, 0}) - for len(q) > 0 { - // This is BFS cycle. Look for up, down, left and right neighbours and if they are suitable for contamination. - // If suitable: add them to the queue - r, c, distance := q[len(q) - 1][0], q[len(q) - 1][1], q[len(q) - 1][2] - q = q[:len(q) - 1] - if grid[r][c] < 0 && grid[r][c] > distance { - continue - } - // If this cell was already updated with shorter distance: skip it. - grid[r][c] = distance - // Check if upper element exists and if it is fresh apple - if r > 0 && (grid[r - 1][c] == 1 || grid[r - 1][c] < distance - 1) { - q = append(q, [3]int{r - 1, c, distance - 1}) - } - // Check if lower element exists and if it is fresh apple - if r < len(grid) - 1 && (grid[r + 1][c] == 1 || grid[r + 1][c] < distance - 1) { - q = append(q, [3]int{r + 1, c, distance - 1}) - } - // Check if left element exists and if it is fresh apple - if c > 0 && (grid[r][c - 1] == 1 || grid[r][c - 1] < distance - 1) { - q = append(q, [3]int{r, c - 1, distance - 1}) - } - // Check if right element exists and if it is fresh apple - if c < len(grid[0]) - 1 && (grid[r][c + 1] == 1 || grid[r][c + 1] < distance - 1) { - q = append(q, [3]int{r, c + 1, distance - 1}) - } - - } - } - } - maxDistance := 0 - for row := 0; row < len(grid); row++ { - for col := 0; col < len(grid[0]); col++ { - switch grid[row][col] { - case 0: - continue - case 1: - // If there is still untouched fresh apple cell, this cell is inaccesible from any rotten cells - // and our little contamination fails =( - return -1 - default: - if maxDistance > grid[row][col] { - maxDistance = grid[row][col] - } - } - } - } - return -maxDistance -} \ No newline at end of file