From f2cfef0ab19b01f23abb9c5db0a2a1d4775360e5 Mon Sep 17 00:00:00 2001 From: Max Li Date: Sun, 16 Jun 2019 13:03:18 +0800 Subject: [PATCH] week_02: id_29 homework --- Week_02/id_29/LeetCode_001_29.go | 21 +++++++++++++++++ Week_02/id_29/LeetCode_003_29.go | 24 ++++++++++++++++++++ Week_02/id_29/LeetCode_098_29.go | 17 ++++++++++++++ Week_02/id_29/LeetCode_100_29.go | 21 +++++++++++++++++ Week_02/id_29/LeetCode_102_29.go | 25 ++++++++++++++++++++ Week_02/id_29/LeetCode_103_29.go | 32 ++++++++++++++++++++++++++ Week_02/id_29/LeetCode_111_29.go | 29 ++++++++++++++++++++++++ Week_02/id_29/LeetCode_236_29.go | 19 ++++++++++++++++ Week_02/id_29/LeetCode_242_29.go | 36 +++++++++++++++++++++++++++++ Week_02/id_29/LeetCode_692_29.go | 39 ++++++++++++++++++++++++++++++++ Week_02/id_29/LeetCode_938_29.go | 22 ++++++++++++++++++ Week_02/id_29/main.go | 12 ++++++++++ 12 files changed, 297 insertions(+) create mode 100644 Week_02/id_29/LeetCode_001_29.go create mode 100644 Week_02/id_29/LeetCode_003_29.go create mode 100644 Week_02/id_29/LeetCode_098_29.go create mode 100644 Week_02/id_29/LeetCode_100_29.go create mode 100644 Week_02/id_29/LeetCode_102_29.go create mode 100644 Week_02/id_29/LeetCode_103_29.go create mode 100644 Week_02/id_29/LeetCode_111_29.go create mode 100644 Week_02/id_29/LeetCode_236_29.go create mode 100644 Week_02/id_29/LeetCode_242_29.go create mode 100644 Week_02/id_29/LeetCode_692_29.go create mode 100644 Week_02/id_29/LeetCode_938_29.go create mode 100644 Week_02/id_29/main.go diff --git a/Week_02/id_29/LeetCode_001_29.go b/Week_02/id_29/LeetCode_001_29.go new file mode 100644 index 00000000..bb7dda8b --- /dev/null +++ b/Week_02/id_29/LeetCode_001_29.go @@ -0,0 +1,21 @@ +package leetcode + +func twoSum(nums []int, target int) []int { + // m store value and index + visited := make(map[int]int) + + for currentIndex, v := range nums { + // 找對應的元素 + counterPart := target - v + + counterPartIndex, ok := visited[counterPart] + if ok { + // 在 map 找到直接回傳 + return []int{counterPartIndex, currentIndex} + } + // 找不到就把自己加入到 map 裡面 + visited[v] = currentIndex + } + + return []int{-1, -1} +} diff --git a/Week_02/id_29/LeetCode_003_29.go b/Week_02/id_29/LeetCode_003_29.go new file mode 100644 index 00000000..220b7a28 --- /dev/null +++ b/Week_02/id_29/LeetCode_003_29.go @@ -0,0 +1,24 @@ +package leetcode + +import "strings" + +func lengthOfLongestSubstring(s string) int { + maxLength := 0 + right := 0 + curr := "" + + for right < len(s) { + char := string(s[right]) + if !strings.Contains(curr, char) { + curr += char + if len(curr) > maxLength { + maxLength = len(curr) + } + right++ + } else { + curr = curr[1:] + } + } + + return maxLength +} diff --git a/Week_02/id_29/LeetCode_098_29.go b/Week_02/id_29/LeetCode_098_29.go new file mode 100644 index 00000000..51154d16 --- /dev/null +++ b/Week_02/id_29/LeetCode_098_29.go @@ -0,0 +1,17 @@ +package leetcode + +func isValidBST(root *TreeNode) bool { + return rec(root, nil, nil) +} + +func rec(node *TreeNode, min, max *int) bool { + if node == nil { + return true + } + + if min != nil && node.Val <= *min || max != nil && node.Val >= *max { + return false + } + + return rec(node.Left, min, &node.Val) && rec(node.Right, &node.Val, max) +} diff --git a/Week_02/id_29/LeetCode_100_29.go b/Week_02/id_29/LeetCode_100_29.go new file mode 100644 index 00000000..da90b194 --- /dev/null +++ b/Week_02/id_29/LeetCode_100_29.go @@ -0,0 +1,21 @@ +package leetcode + +func isSymmetric(root *TreeNode) bool { + if root == nil { + return true + } + + return ish(root.Left, root.Right) +} + +func ish(l, r *TreeNode) bool { + if l == nil || r == nil { + return l == r + } + + if l.Val != r.Val { + return false + } + + return ish(l.Left, r.Right) && ish(l.Right, r.Left) +} diff --git a/Week_02/id_29/LeetCode_102_29.go b/Week_02/id_29/LeetCode_102_29.go new file mode 100644 index 00000000..3a05721d --- /dev/null +++ b/Week_02/id_29/LeetCode_102_29.go @@ -0,0 +1,25 @@ +package leetcode + +func levelOrder(root *TreeNode) [][]int { + var ret [][]int + + level := 1 + helper(root, level, &ret) + + return ret +} + +func helper(root *TreeNode, level int, ret *[][]int) { + if root == nil { + return + } + + if len(*ret) < level { + *ret = append(*ret, []int{root.Val}) + } else { + (*ret)[level-1] = append((*ret)[level-1], root.Val) + } + + helper(root.Left, level+1, ret) + helper(root.Right, level+1, ret) +} diff --git a/Week_02/id_29/LeetCode_103_29.go b/Week_02/id_29/LeetCode_103_29.go new file mode 100644 index 00000000..65352afe --- /dev/null +++ b/Week_02/id_29/LeetCode_103_29.go @@ -0,0 +1,32 @@ +package leetcode + +func zigzagLevelOrder(root *TreeNode) [][]int { + var result [][]int + + vector := 1 + stack := []*TreeNode{root} + + for len(stack) > 0 { + var tmp []*TreeNode + var levelVal []int + for i := len(stack) - 1; i >= 0; i-- { + node := stack[i] + if node == nil { + continue + } + if vector == 1 { + tmp = append(tmp, node.Left, node.Right) + } else { + tmp = append(tmp, node.Right, node.Left) + } + levelVal = append(levelVal, node.Val) + } + vector = -vector + stack = tmp + if len(levelVal) > 0 { + result = append(result, levelVal) + } + } + + return result +} diff --git a/Week_02/id_29/LeetCode_111_29.go b/Week_02/id_29/LeetCode_111_29.go new file mode 100644 index 00000000..7f5680cd --- /dev/null +++ b/Week_02/id_29/LeetCode_111_29.go @@ -0,0 +1,29 @@ +package leetcode + +func minDepth(root *TreeNode) int { + if root == nil { + return 0 + } + left := minDepth(root.Left) + right := minDepth(root.Right) + if left == 0 || right == 0 { + return 1 + max(left, right) + } + return 1 + min(left, right) +} + +func min(x, y int) int { + if x >= y { + return y + } else { + return x + } +} + +func max(x, y int) int { + if x <= y { + return y + } else { + return x + } +} diff --git a/Week_02/id_29/LeetCode_236_29.go b/Week_02/id_29/LeetCode_236_29.go new file mode 100644 index 00000000..ab1b7fc7 --- /dev/null +++ b/Week_02/id_29/LeetCode_236_29.go @@ -0,0 +1,19 @@ +package leetcode + +func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { + if root == nil { + return nil + } + if root == p || root == q { + return root + } + left := lowestCommonAncestor(root.Left, p, q) + right := lowestCommonAncestor(root.Right, p, q) + if left != nil && right != nil { + return root + } + if left == nil { + return right + } + return left +} diff --git a/Week_02/id_29/LeetCode_242_29.go b/Week_02/id_29/LeetCode_242_29.go new file mode 100644 index 00000000..71466695 --- /dev/null +++ b/Week_02/id_29/LeetCode_242_29.go @@ -0,0 +1,36 @@ +package leetcode + +func isAnagram(s string, t string) bool { + if len(s) != len(t) { + return false + } + + mapA := buildCharMap(s) + mapB := buildCharMap(t) + + for key, Acount := range mapA { + Bcount, ok := mapB[key] + if !ok { + return false + } + if Acount != Bcount { + return false + } + } + + return true +} + +func buildCharMap(s string) map[rune]int { + m := make(map[rune]int) + + for _, char := range s { + if _, ok := m[char]; ok { + m[char]++ + } else { + m[char] = 1 + } + } + + return m +} diff --git a/Week_02/id_29/LeetCode_692_29.go b/Week_02/id_29/LeetCode_692_29.go new file mode 100644 index 00000000..0d16f64b --- /dev/null +++ b/Week_02/id_29/LeetCode_692_29.go @@ -0,0 +1,39 @@ +package leetcode + +import "sort" + +type entry struct { + word string + frequence int +} + +type freWords []*entry + +func topKFrequent(words []string, k int) []string { + count := make(map[string]int, len(words)) + for _, w := range words { + count[w]++ + } + + fw := make(freWords, 0, len(count)) + for w, c := range count { + fw = append(fw, &entry{ + word: w, + frequence: c, + }) + } + + sort.Slice(fw, func(i, j int) bool { + if fw[i].frequence == fw[j].frequence { + return fw[i].word < fw[j].word + } + return fw[i].frequence > fw[j].frequence + }) + + res := make([]string, k) + for i := 0; i < k; i++ { + res[i] = fw[i].word + } + + return res +} diff --git a/Week_02/id_29/LeetCode_938_29.go b/Week_02/id_29/LeetCode_938_29.go new file mode 100644 index 00000000..41dcc321 --- /dev/null +++ b/Week_02/id_29/LeetCode_938_29.go @@ -0,0 +1,22 @@ +package leetcode + +func rangeSumBST(root *TreeNode, L int, R int) int { + if root == nil { + return 0 + } + + sum := 0 + + switch { + case root.Val < L: + sum = rangeSumBST(root.Right, L, R) + case R < root.Val: + sum = rangeSumBST(root.Left, L, R) + default: + sum += root.Val + sum += rangeSumBST(root.Left, L, R) + sum += rangeSumBST(root.Right, L, R) + } + + return sum +} diff --git a/Week_02/id_29/main.go b/Week_02/id_29/main.go new file mode 100644 index 00000000..8aaf4acf --- /dev/null +++ b/Week_02/id_29/main.go @@ -0,0 +1,12 @@ +package leetcode + +type ListNode struct { + Val int + Next *ListNode +} + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +}