From a4bae370734ec0776fe245090b42395b7ec7da39 Mon Sep 17 00:00:00 2001 From: renzhen Date: Wed, 12 Jun 2019 22:03:16 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_10/Leecode-102-10.go | 53 +++++++++++++++++++++++ Week_02/id_10/Leecode-242-10.go | 40 +++++++++++++++++ Week_02/id_10/Leecode-3-10.go | 27 ++++++++++++ Week_02/id_10/Leecode-692-10.go | 44 +++++++++++++++++++ Week_02/id_10/Leecode-726-10.go | 76 +++++++++++++++++++++++++++++++++ Week_02/id_10/Leecode-783-10.go | 32 ++++++++++++++ Week_02/id_10/Leecode-938-10.go | 24 +++++++++++ Week_02/id_10/Leecode-98-10.go | 37 ++++++++++++++++ 8 files changed, 333 insertions(+) create mode 100644 Week_02/id_10/Leecode-102-10.go create mode 100644 Week_02/id_10/Leecode-242-10.go create mode 100644 Week_02/id_10/Leecode-3-10.go create mode 100644 Week_02/id_10/Leecode-692-10.go create mode 100644 Week_02/id_10/Leecode-726-10.go create mode 100644 Week_02/id_10/Leecode-783-10.go create mode 100644 Week_02/id_10/Leecode-938-10.go create mode 100644 Week_02/id_10/Leecode-98-10.go diff --git a/Week_02/id_10/Leecode-102-10.go b/Week_02/id_10/Leecode-102-10.go new file mode 100644 index 00000000..46017061 --- /dev/null +++ b/Week_02/id_10/Leecode-102-10.go @@ -0,0 +1,53 @@ +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +//DFS +var result [][]int + +func levelOrder(root *TreeNode) [][]int { + result = [][]int{} + helper(root, 0) + return result +} + +func helper(root *TreeNode, level int) { + if root == nil { + return + } + if len(result) <= level { + result = append(result, []int{}) + } + result[level] = append(result[level], root.Val) + helper(root.Left, level+1) + helper(root.Right, level+1) +} + +//BFS +func levelOrder2(root *TreeNode) [][]int { + if root == nil { + return [][]int{} + } + result := make([][]int, 0) + nodes := []*TreeNode{root} + for len(nodes) > 0 { + result = append(result, []int{}) + newnodes := make([]*TreeNode, 0) + for i := 0; i < len(nodes); i++ { + node := nodes[i] + result[len(result)-1] = append(result[len(result)-1], node.Val) + if node.Left != nil { + newnodes = append(newnodes, node.Left) + } + if node.Right != nil { + newnodes = append(newnodes, node.Right) + } + } + nodes = newnodes + } + return result +} \ No newline at end of file diff --git a/Week_02/id_10/Leecode-242-10.go b/Week_02/id_10/Leecode-242-10.go new file mode 100644 index 00000000..c6472d8b --- /dev/null +++ b/Week_02/id_10/Leecode-242-10.go @@ -0,0 +1,40 @@ +func isAnagram(s string, t string) bool { + if len(s) != len(t) { + return false + } + // 如果字符串包含 unicode 字符,使用map处理 + // 测试数据:"中国" ,"国中" + anagramrel := make(map[rune]int) + for _, b := range s { + anagramrel[b]++ + } + for _, b := range t { + anagramrel[b]-- + if anagramrel[b] < 0 { + return false + } + } + return true +} + +func isAnagram2(s string, t string) bool { + sbytes := []byte(s) + tbytes := []byte(t) + if len(sbytes) != len(tbytes) { + return false + } + // 如果字符串只包含小写字母 创建len=26的数组代替map + hasharr := make([]int, 26) + for i := 0; i < len(sbytes); i++ { + sb := sbytes[i] + hasharr[sb-'a'] += 1 + } + for i := 0; i < len(tbytes); i++ { + tb := tbytes[i] + hasharr[tb-'a'] -= 1 + if hasharr[tb-'a'] < 0 { + return false + } + } + return true +} diff --git a/Week_02/id_10/Leecode-3-10.go b/Week_02/id_10/Leecode-3-10.go new file mode 100644 index 00000000..04a0f09d --- /dev/null +++ b/Week_02/id_10/Leecode-3-10.go @@ -0,0 +1,27 @@ +func lengthOfLongestSubstring(s string) int { + if len(s) == 0 { + return 0 + } + maxsublen := 1 + lastlen := 1 + alphaposrel := make(map[byte]int) + alphaposrel[s[0]] = 0 + for i := 1; i < len(s); i++ { + b := s[i] + cursublen := 0 + if pos, ok := alphaposrel[b]; ok { + cursublen = i - pos + } else { + cursublen = i + 1 + } + if cursublen > lastlen+1 { + cursublen = lastlen + 1 + } + if maxsublen < cursublen { + maxsublen = cursublen + } + lastlen = cursublen + alphaposrel[b] = i + } + return maxsublen +} \ No newline at end of file diff --git a/Week_02/id_10/Leecode-692-10.go b/Week_02/id_10/Leecode-692-10.go new file mode 100644 index 00000000..336a5ba7 --- /dev/null +++ b/Week_02/id_10/Leecode-692-10.go @@ -0,0 +1,44 @@ +import "sort" + +type WNode struct { + Val string + Frequent int +} + +type WNodes []*WNode + +func (s WNodes) Len() int { return len(s) } +func (s WNodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s WNodes) Less(i, j int) bool { + if s[i].Frequent > s[j].Frequent { + return true + } else if s[i].Frequent == s[j].Frequent { + return s[i].Val < s[j].Val + } + return false +} + +func topKFrequent(words []string, k int) []string { + if k <= 0 { + return []string{} + } + frequenthash := make(map[string]*WNode) + frequentarr := make([]*WNode, 0, len(words)) + for i := 0; i < len(words); i++ { + w := words[i] + if node, ok := frequenthash[w]; ok { + node.Frequent++ + } else { + node = &WNode{w, 1} + frequenthash[w] = node + frequentarr = append(frequentarr, node) + } + } + sort.Sort(WNodes(frequentarr)) + retarr := make([]string, k) + for i := 0; i < k; i++ { + retarr[i] = frequentarr[i].Val + } + return retarr + +} diff --git a/Week_02/id_10/Leecode-726-10.go b/Week_02/id_10/Leecode-726-10.go new file mode 100644 index 00000000..aeae82bc --- /dev/null +++ b/Week_02/id_10/Leecode-726-10.go @@ -0,0 +1,76 @@ +import "strconv" +import "strings" +import "sort" + +func countOfAtoms(formula string) string { + s := []byte(formula) + resultmap, _ := helper(s, 0) + resultstrs := make([]string, len(resultmap)) + for k, v := range resultmap { + vstr := strconv.Itoa(v) + if vstr == "1" { + vstr = "" + } + resultstrs = append(resultstrs, k+vstr) + } + sort.Strings(resultstrs) + return strings.Join(resultstrs, "") + +} + +func helper(s []byte, start int) (map[string]int, int) { + elmentmap := make(map[string]int) + i := start + curel := "" + for i < len(s) { + if curel != "" && (s[i] < '0' || s[i] > '9') { + elmentmap[curel] += 1 + curel = "" + } + if s[i] >= 'A' && s[i] <= 'Z' { + elbytes := make([]byte, 0) + elbytes = append(elbytes, s[i]) + for i+1 < len(s) && s[i+1] >= 'a' && s[i+1] <= 'z' { + i++ + elbytes = append(elbytes, s[i]) + } + curel = string(elbytes) + } + if s[i] >= '0' && s[i] <= '9' { + nbyte := make([]byte, 0) + nbyte = append(nbyte, s[i]) + for i+1 < len(s) && s[i+1] >= '0' && s[i+1] <= '9' { + i++ + nbyte = append(nbyte, s[i]) + } + numbyte, _ := strconv.Atoi(string(nbyte)) + elmentmap[curel] += numbyte + curel = "" + } else if s[i] == '(' { + subelmap, pos := helper(s, i+1) + for k, v := range subelmap { + elmentmap[k] += v + } + i = pos + } else if s[i] == ')' { + nbyte := make([]byte, 0) + for i+1 < len(s) && s[i+1] >= '0' && s[i+1] <= '9' { + i++ + nbyte = append(nbyte, s[i]) + } + if len(nbyte) > 0 { + numbyte, _ := strconv.Atoi(string(nbyte)) + for k, v := range elmentmap { + elmentmap[k] = v * numbyte + } + } + return elmentmap, i + } + i++ + } + if curel != "" { + elmentmap[curel] += 1 + curel = "" + } + return elmentmap, i +} \ No newline at end of file diff --git a/Week_02/id_10/Leecode-783-10.go b/Week_02/id_10/Leecode-783-10.go new file mode 100644 index 00000000..1217ee40 --- /dev/null +++ b/Week_02/id_10/Leecode-783-10.go @@ -0,0 +1,32 @@ +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +//二叉树 中序遍历 递增 +const int_min = ^int(^uint(0) >> 1) + +var pre int +var min_diff int + +func minDiffInBST(root *TreeNode) int { + pre = int_min + min_diff = int(^uint(0) >> 1) + _dfs(root) + return min_diff +} + +func _dfs(root *TreeNode) { + if root == nil { + return + } + _dfs(root.Left) + if pre != int_min && root.Val-pre < min_diff { + min_diff = root.Val - pre + } + pre = root.Val + _dfs(root.Right) +} \ No newline at end of file diff --git a/Week_02/id_10/Leecode-938-10.go b/Week_02/id_10/Leecode-938-10.go new file mode 100644 index 00000000..fd13a4a8 --- /dev/null +++ b/Week_02/id_10/Leecode-938-10.go @@ -0,0 +1,24 @@ +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func rangeSumBST(root *TreeNode, L int, R int) int { + if root == nil { + return 0 + } + result := 0 + if root.Val < L { + result += rangeSumBST(root.Right, L, R) + } else if root.Val > R { + result += rangeSumBST(root.Left, L, R) + } else { + result += root.Val + result += rangeSumBST(root.Left, L, R) + result += rangeSumBST(root.Right, L, R) + } + return result +} \ No newline at end of file diff --git a/Week_02/id_10/Leecode-98-10.go b/Week_02/id_10/Leecode-98-10.go new file mode 100644 index 00000000..8388e80b --- /dev/null +++ b/Week_02/id_10/Leecode-98-10.go @@ -0,0 +1,37 @@ +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +var pre int + +func isValidBST(root *TreeNode) bool { + if root == nil { + return true + } + // int类型的最小值 + pre = ^int(^uint(0) >> 1) + return _dfs(root) +} + +//二叉搜索树 中序遍历 递增序列 +func _dfs(root *TreeNode) bool { + if root == nil { + return true + } + if !_dfs(root.Left) { + return false + } + curVal := root.Val + if curVal <= pre { + return false + } + pre = curVal + if !_dfs(root.Right) { + return false + } + return true +} \ No newline at end of file From a293d57f6cd4d6f202254e935ba011b2e3c14ab1 Mon Sep 17 00:00:00 2001 From: renzhen Date: Thu, 13 Jun 2019 22:22:56 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=96=B0=E5=A2=9Eleecode=20103=20Go?= =?UTF-8?q?=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_10/Leecode-103-10.go | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Week_02/id_10/Leecode-103-10.go diff --git a/Week_02/id_10/Leecode-103-10.go b/Week_02/id_10/Leecode-103-10.go new file mode 100644 index 00000000..ecc9ed56 --- /dev/null +++ b/Week_02/id_10/Leecode-103-10.go @@ -0,0 +1,45 @@ +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func zigzagLevelOrder(root *TreeNode) [][]int { + if root == nil { + return [][]int{} + } + nodes := []*TreeNode{root} + result := make([][]int, 0) + reversed := true + for len(nodes) > 0 { + newnodes := make([]*TreeNode, 0) + result = append(result, []int{}) + for i := 0; i < len(nodes); i++ { + node := nodes[i] + result[len(result)-1] = append(result[len(result)-1], node.Val) + } + for i := len(nodes) - 1; i >= 0; i-- { + node := nodes[i] + if reversed { + if node.Right != nil { + newnodes = append(newnodes, node.Right) + } + if node.Left != nil { + newnodes = append(newnodes, node.Left) + } + } else { + if node.Left != nil { + newnodes = append(newnodes, node.Left) + } + if node.Right != nil { + newnodes = append(newnodes, node.Right) + } + } + } + nodes = newnodes + reversed = !reversed + } + return result +} \ No newline at end of file From e656ef6803a289dd2c0e50538cbcde8cf0fca98a Mon Sep 17 00:00:00 2001 From: renzhen Date: Thu, 20 Jun 2019 00:36:34 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E7=AE=97=E6=B3=95=E8=AF=BE=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E5=91=A8=E4=BD=9C=E4=B8=9A=20go=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_10/Leecode-104-10.go | 25 +++++++++++++++++ Week_03/id_10/Leecode-111-10.go | 39 +++++++++++++++++++++++++++ Week_03/id_10/Leecode-200-10.go | 30 +++++++++++++++++++++ Week_03/id_10/Leecode-310-10.go | 48 +++++++++++++++++++++++++++++++++ Week_03/id_10/Leecode-529-10.go | 47 ++++++++++++++++++++++++++++++++ Week_03/id_10/Leecode-802-10.go | 41 ++++++++++++++++++++++++++++ 6 files changed, 230 insertions(+) create mode 100644 Week_03/id_10/Leecode-104-10.go create mode 100644 Week_03/id_10/Leecode-111-10.go create mode 100644 Week_03/id_10/Leecode-200-10.go create mode 100644 Week_03/id_10/Leecode-310-10.go create mode 100644 Week_03/id_10/Leecode-529-10.go create mode 100644 Week_03/id_10/Leecode-802-10.go diff --git a/Week_03/id_10/Leecode-104-10.go b/Week_03/id_10/Leecode-104-10.go new file mode 100644 index 00000000..0fe7921c --- /dev/null +++ b/Week_03/id_10/Leecode-104-10.go @@ -0,0 +1,25 @@ +package leecode + +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func maxDepth(root *TreeNode) int { + if root == nil { + return 0 + } + if root.Left == nil && root.Right == nil { + return 1 + } + leftDepth := maxDepth(root.Left) + rightDepth := maxDepth(root.Right) + if leftDepth > rightDepth { + return leftDepth + 1 + } else { + return rightDepth + 1 + } +} diff --git a/Week_03/id_10/Leecode-111-10.go b/Week_03/id_10/Leecode-111-10.go new file mode 100644 index 00000000..6970831d --- /dev/null +++ b/Week_03/id_10/Leecode-111-10.go @@ -0,0 +1,39 @@ +package leecode + +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +var mindepth int + +func minDepth(root *TreeNode) int { + if root == nil { + return 0 + } + const MAXINT = int(^uint(0) >> 1) + mindepth = MAXINT + dfs(root, 1) + return mindepth +} + +func dfs(root *TreeNode, level int) { + if root.Left == nil && root.Right == nil { + if level < mindepth { + mindepth = level + } + return + } + if level >= mindepth { + return + } + if root.Left != nil { + dfs(root.Left, level+1) + } + if root.Right != nil { + dfs(root.Right, level+1) + } +} diff --git a/Week_03/id_10/Leecode-200-10.go b/Week_03/id_10/Leecode-200-10.go new file mode 100644 index 00000000..a26473b5 --- /dev/null +++ b/Week_03/id_10/Leecode-200-10.go @@ -0,0 +1,30 @@ +package leecode + +func numIslands(grid [][]byte) int { + count := 0 + for i := 0; i < len(grid); i++ { + for j := 0; j < len(grid[0]); j++ { + if grid[i][j] == '1' { + count++ + helper(grid, i, j) + } + } + } + return count +} + +func helper(grid [][]byte, i, j int) { + m := len(grid) + n := len(grid[0]) + if i < 0 || j < 0 || i >= m || j >= n { + return + } + if grid[i][j] == '0' { + return + } + grid[i][j] = '0' + helper(grid, i+1, j) + helper(grid, i, j+1) + helper(grid, i-1, j) + helper(grid, i, j-1) +} diff --git a/Week_03/id_10/Leecode-310-10.go b/Week_03/id_10/Leecode-310-10.go new file mode 100644 index 00000000..6701242f --- /dev/null +++ b/Week_03/id_10/Leecode-310-10.go @@ -0,0 +1,48 @@ +package leecode + +func findMinHeightTrees(n int, edges [][]int) []int { + if n == 0 { + return []int{} + } + if n == 1 { + return []int{0} + } + + graphs := make([][]int, n) + count := make([]int, n) + for i := 0; i < len(edges); i++ { + graphs[edges[i][0]] = append(graphs[edges[i][0]], edges[i][1]) + graphs[edges[i][1]] = append(graphs[edges[i][1]], edges[i][0]) + count[edges[i][1]]++ + count[edges[i][0]]++ + } + leaves := []int{} + for i := 0; i < len(count); i++ { + if count[i] == 1 { + leaves = append(leaves, i) + count[i] = 0 + } + } + for len(leaves) > 0 { + newleaves := []int{} + for j := 0; j < len(leaves); j++ { + nextlevels := graphs[leaves[j]] + for i := 0; i < len(nextlevels); i++ { + leaf := nextlevels[i] + if count[leaf] > 0 { + count[leaf]-- + if count[leaf] == 1 { + newleaves = append(newleaves, leaf) + count[leaf] = 0 + } + } + } + } + if len(newleaves) == 0 { + return leaves + } + leaves = newleaves + } + + return []int{} +} diff --git a/Week_03/id_10/Leecode-529-10.go b/Week_03/id_10/Leecode-529-10.go new file mode 100644 index 00000000..ef5f2040 --- /dev/null +++ b/Week_03/id_10/Leecode-529-10.go @@ -0,0 +1,47 @@ +package leecode + +func updateBoard(board [][]byte, click []int) [][]byte { + if board[click[0]][click[1]] == 'M' { + board[click[0]][click[1]] = 'X' + } else if board[click[0]][click[1]] == 'E' { + helper(board, click) + } + return board +} + +func helper(board [][]byte, pos []int) { + x, y := pos[0], pos[1] + minescount := byte(0) + if board[x][y] != 'E' { + return + } + alldots := make([][]int, 8) + alldots[0] = []int{x - 1, y - 1} + alldots[1] = []int{x, y - 1} + alldots[2] = []int{x + 1, y - 1} + alldots[3] = []int{x - 1, y} + alldots[4] = []int{x - 1, y + 1} + alldots[5] = []int{x, y + 1} + alldots[6] = []int{x + 1, y + 1} + alldots[7] = []int{x + 1, y} + nextposes := make([][]int, 0, 8) + for i := 0; i < 8; i++ { + posx, posy := alldots[i][0], alldots[i][1] + if posx >= 0 && posy >= 0 && posx < len(board) && posy < len(board[0]) { + if board[posx][posy] == 'M' { + minescount++ + } else if board[posx][posy] == 'E' { + nextposes = append(nextposes, []int{posx, posy}) + } + } + } + if minescount > 0 { + board[x][y] = '0' + minescount + } else { + board[x][y] = 'B' + for _, npos := range nextposes { + helper(board, npos) + } + } + +} diff --git a/Week_03/id_10/Leecode-802-10.go b/Week_03/id_10/Leecode-802-10.go new file mode 100644 index 00000000..2394f198 --- /dev/null +++ b/Week_03/id_10/Leecode-802-10.go @@ -0,0 +1,41 @@ +package leecode + +var safenodes []int +var curgraph [][]int +var visited []bool + +func eventualSafeNodes(graph [][]int) []int { + n := len(graph) + safenodes = make([]int, n) + curgraph = graph + results := make([]int, 0) + visited = make([]bool, n) + for i := 0; i < n; i++ { + if isSafeNode(i) { + results = append(results, i) + } + } + return results +} + +func isSafeNode(i int) bool { + if safenodes[i] == 1 { + return true + } else if safenodes[i] == -1 { + return false + } + graph := curgraph + visited[i] = true + for j := 0; j < len(graph[i]); j++ { + node := graph[i][j] + if safenodes[node] == 1 { + continue + } + if visited[node] || !isSafeNode(node) { + safenodes[i] = -1 + return false + } + } + safenodes[i] = 1 + return true +} From e12e00eecc0311f9c372d09c61b4567b5fe7ac4b Mon Sep 17 00:00:00 2001 From: renzhen Date: Fri, 21 Jun 2019 21:06:12 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20leecode=20210&703=20Go?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_10/Leecode-210-10.go | 83 +++++++++++++++++++++++++++++++++ Week_03/id_10/Leecode-703-10.go | 56 ++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 Week_03/id_10/Leecode-210-10.go create mode 100644 Week_03/id_10/Leecode-703-10.go diff --git a/Week_03/id_10/Leecode-210-10.go b/Week_03/id_10/Leecode-210-10.go new file mode 100644 index 00000000..954cad65 --- /dev/null +++ b/Week_03/id_10/Leecode-210-10.go @@ -0,0 +1,83 @@ +package leecode + +func findOrder(numCourses int, prerequisites [][]int) []int { + // 拓扑排序 BFS + courserel := make([][]int, numCourses) + indegree := make([]int, numCourses) + for _, prereq := range prerequisites { + if courserel[prereq[1]] == nil || len(courserel[prereq[1]]) == 0 { + courserel[prereq[1]] = []int{prereq[0]} + } else { + courserel[prereq[1]] = append(courserel[prereq[1]], prereq[0]) + } + indegree[prereq[0]]++ + } + queen := make([]int, 0) + for i, degree := range indegree { + if degree == 0 { + queen = append(queen, i) + } + } + result := make([]int, 0) + for len(queen) > 0 { + top := queen[0] + queen = queen[1:len(queen)] + result = append(result, top) + if courserel[top] != nil && len(courserel[top]) > 0 { + for _, c := range courserel[top] { + indegree[c]-- + if indegree[c] == 0 { + queen = append(queen, c) + } + } + } + } + if len(result) != numCourses { + return []int{} + } + return result +} + +func findOrder2(numCourses int, prerequisites [][]int) []int { + // DFS + courserels := make([][]int, numCourses) + for _, prereq := range prerequisites { + if courserels[prereq[0]] == nil { + courserels[prereq[0]] = []int{prereq[1]} + } else { + courserels[prereq[0]] = append(courserels[prereq[0]], prereq[1]) + } + } + visited := make([]int, numCourses) + result := make([]int, 0) + var dfs func(course int) bool + dfs = func(course int) bool { + if visited[course] == 1 { + return false + } + if visited[course] == 2 { + return true + } + visited[course] = 1 + if courserels[course] == nil || len(courserels[course]) == 0 { + result = append(result, course) + visited[course] = 2 + return true + } + for _, next_course := range courserels[course] { + if !dfs(next_course) { + return false + } + } + result = append(result, course) + visited[course] = 2 + return true + } + for i := 0; i < numCourses; i++ { + if !dfs(i) { + return []int{} + } + } + return result + +} diff --git a/Week_03/id_10/Leecode-703-10.go b/Week_03/id_10/Leecode-703-10.go new file mode 100644 index 00000000..1c8ffdae --- /dev/null +++ b/Week_03/id_10/Leecode-703-10.go @@ -0,0 +1,56 @@ +package leecode + +import "container/heap" + +type IntHeap []int + +func (h IntHeap) Len() int { return len(h) } +func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] } +func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } +func (h *IntHeap) Push(x interface{}) { + *h = append(*h, x.(int)) +} +func (h *IntHeap) Pop() interface{} { + old := *h + n := len(old) + x := old[n-1] + *h = old[0 : n-1] + return x +} + +type KthLargest struct { + k int + h *IntHeap +} + +func Constructor(k int, nums []int) KthLargest { + h := &IntHeap{} + heap.Init(h) + for i := 0; i < len(nums); i++ { + if i < k { + heap.Push(h, nums[i]) + } else if (*h)[0] < nums[i] { + heap.Push(h, nums[i]) + heap.Pop(h) + } + } + return KthLargest{k, h} +} + +func (this *KthLargest) Add(val int) int { + k := this.k + h := this.h + if len(*h) < k { + heap.Push(h, val) + } else if (*h)[0] < val { + heap.Push(h, val) + heap.Pop(h) + } + return (*h)[0] +} + +/** + * Your KthLargest object will be instantiated and called as such: + * obj := Constructor(k, nums); + * param_1 := obj.Add(val); + */