diff --git "a/Week_01/1.\344\270\244\346\225\260\344\271\213\345\222\214.go" "b/Week_01/1.\344\270\244\346\225\260\344\271\213\345\222\214.go" new file mode 100644 index 00000000..6e8bea30 --- /dev/null +++ "b/Week_01/1.\344\270\244\346\225\260\344\271\213\345\222\214.go" @@ -0,0 +1,21 @@ +/* + * @lc app=leetcode.cn id=1 lang=golang + * + * [1] 两数之和 + */ + +// @lc code=start +func twoSum(nums []int, target int) []int { + m := make(map[int]int) + for i, num := range nums { + other := target - num + if j, ok := m[other]; ok { + return []int{j, i} + } + m[num] = i + } + return nil +} + +// @lc code=end + diff --git "a/Week_01/189.\346\227\213\350\275\254\346\225\260\347\273\204.go" "b/Week_01/189.\346\227\213\350\275\254\346\225\260\347\273\204.go" new file mode 100644 index 00000000..a98ec7f2 --- /dev/null +++ "b/Week_01/189.\346\227\213\350\275\254\346\225\260\347\273\204.go" @@ -0,0 +1,14 @@ +/* + * @lc app=leetcode.cn id=189 lang=golang + * + * [189] 旋转数组 + */ + +// @lc code=start +func rotate(nums []int, k int) { + k = len(nums) - k%len(nums) + copy(nums, append(nums[k:], nums[0:k]...)) +} + +// @lc code=end + diff --git "a/Week_01/21.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250.go" "b/Week_01/21.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250.go" new file mode 100644 index 00000000..f6e7fce5 --- /dev/null +++ "b/Week_01/21.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250.go" @@ -0,0 +1,31 @@ +/* + * @lc app=leetcode.cn id=21 lang=golang + * + * [21] 合并两个有序链表 + */ + +// @lc code=start +/** + * Definition for singly-linked list. + * type ListNode struct { + * Val int + * Next *ListNode + * } + */ +func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { + if l1 == nil { + return l2 + } + if l2 == nil { + return l1 + } + if l1.Val <= l2.Val { + l1.Next = mergeTwoLists(l1.Next, l2) + return l1 + } + l2.Next = mergeTwoLists(l1, l2.Next) + return l2 +} + +// @lc code=end + diff --git "a/Week_01/26.\345\210\240\351\231\244\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271.go" "b/Week_01/26.\345\210\240\351\231\244\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271.go" new file mode 100644 index 00000000..5ecc1566 --- /dev/null +++ "b/Week_01/26.\345\210\240\351\231\244\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271.go" @@ -0,0 +1,18 @@ +/* + * @lc app=leetcode.cn id=26 lang=golang + * + * [26] 删除排序数组中的重复项 + */ + +// @lc code=start +func removeDuplicates(nums []int) int { + for i := len(nums) - 1; i > 0; i-- { + if nums[i] == nums[i-1] { + nums = append(nums[:i], nums[i+1:]...) + } + } + return len(nums) +} + +// @lc code=end + diff --git "a/Week_01/283.\347\247\273\345\212\250\351\233\266.go" "b/Week_01/283.\347\247\273\345\212\250\351\233\266.go" new file mode 100644 index 00000000..fd3bce51 --- /dev/null +++ "b/Week_01/283.\347\247\273\345\212\250\351\233\266.go" @@ -0,0 +1,28 @@ +/* + * @lc app=leetcode.cn id=283 lang=golang + * + * [283] 移动零 + */ + +// @lc code=start +func moveZeroes(nums []int) { + if nums == nil { + return + } + // 双指针法 + // j -> 慢指针 + var j = 0 + // i -> 快指针 + for i := 0; i < len(nums); i++ { + // i遇到不为0 + if nums[i] != 0 { + // i和j交换 + nums[j], nums[i] = nums[i], nums[j] + // j前移 + j++ + } + } +} + +// @lc code=end + diff --git "a/Week_01/66.\345\212\240\344\270\200.go" "b/Week_01/66.\345\212\240\344\270\200.go" new file mode 100644 index 00000000..2c7b2abd --- /dev/null +++ "b/Week_01/66.\345\212\240\344\270\200.go" @@ -0,0 +1,21 @@ +/* + * @lc app=leetcode.cn id=66 lang=golang + * + * [66] 加一 + */ + +// @lc code=start +func plusOne(digits []int) []int { + for i := len(digits) - 1; i >= 0; i-- { + if digits[i] != 9 { + digits[i]++ + return digits + } + digits[i] = 0 + } + return append([]int{1}, digits...) + +} + +// @lc code=end + diff --git "a/Week_01/88.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204.go" "b/Week_01/88.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204.go" new file mode 100644 index 00000000..2bfe8ce6 --- /dev/null +++ "b/Week_01/88.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204.go" @@ -0,0 +1,35 @@ +/* + * @lc app=leetcode.cn id=88 lang=golang + * + * [88] 合并两个有序数组 + */ + +// @lc code=start +func merge(nums1 []int, m int, nums2 []int, n int) { + l := m + n - 1 + mm := m - 1 + nn := n - 1 + for mm >= 0 && nn >= 0 { + if nums1[mm] > nums2[nn] { + nums1[l] = nums1[mm] + mm-- + } else { + nums1[l] = nums2[nn] + nn-- + } + l-- + } + for mm >= 0 { + nums1[l] = nums1[mm] + l-- + mm-- + } + for nn >= 0 { + nums1[l] = nums2[nn] + l-- + nn-- + } +} + +// @lc code=end + diff --git a/Week_01/README.md b/Week_01/README.md index 50de3041..d63c47bb 100644 --- a/Week_01/README.md +++ b/Week_01/README.md @@ -1 +1,9 @@ -学习笔记 \ No newline at end of file +## 学习笔记 + +1. `LRU Cache`采用`链表`实现 +2. `Redis`采用`跳表`实现 +3. `双指针`,快慢指针(移动零)和头尾指针夹逼(盛最多的水、) +4. `空间换时间`(斐波那契数列、两数之和<采用`哈希表`进行空间换时间>) +5. `最近相关性`采用`栈`实现,从外向内逐渐扩散,或者从内向外逐渐扩散,最内层和最内层是一对,最外层和最外层是一对 +6. 只用`栈`或者只用`队列`来实现对方,用`2个栈`或者`2个队列`进行解决 +7. `滑动窗口`采用`双端队列`解决 diff --git "a/Week_02/1.\344\270\244\346\225\260\344\271\213\345\222\214.go" "b/Week_02/1.\344\270\244\346\225\260\344\271\213\345\222\214.go" new file mode 100644 index 00000000..6e8bea30 --- /dev/null +++ "b/Week_02/1.\344\270\244\346\225\260\344\271\213\345\222\214.go" @@ -0,0 +1,21 @@ +/* + * @lc app=leetcode.cn id=1 lang=golang + * + * [1] 两数之和 + */ + +// @lc code=start +func twoSum(nums []int, target int) []int { + m := make(map[int]int) + for i, num := range nums { + other := target - num + if j, ok := m[other]; ok { + return []int{j, i} + } + m[num] = i + } + return nil +} + +// @lc code=end + diff --git "a/Week_02/144.\344\272\214\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.go" "b/Week_02/144.\344\272\214\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.go" new file mode 100644 index 00000000..797711da --- /dev/null +++ "b/Week_02/144.\344\272\214\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.go" @@ -0,0 +1,28 @@ +/* + * @lc app=leetcode.cn id=144 lang=golang + * + * [144] 二叉树的前序遍历 + */ + +// @lc code=start +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func preorderTraversal(root *TreeNode) []int { + if root == nil { + return []int{} + } + var ret []int + ret = append(ret, root.Val) + ret = append(ret, preorderTraversal(root.Left)...) + ret = append(ret, preorderTraversal(root.Right)...) + return ret +} + +// @lc code=end + diff --git "a/Week_02/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.go" "b/Week_02/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.go" new file mode 100644 index 00000000..11d721a0 --- /dev/null +++ "b/Week_02/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.go" @@ -0,0 +1,31 @@ +/* + * @lc app=leetcode.cn id=242 lang=golang + * + * [242] 有效的字母异位词 + */ + +// @lc code=start +func isAnagram(s string, t string) bool { + if len(s) != len(t) { + return false + } + hash := map[rune]int{} + for _, v := range s { + hash[v]++ + } + for _, v := range t { + vs, ok := hash[v] + if !ok { + return false + } + if vs == 1 { + delete(hash, v) + } else { + hash[v]-- + } + } + return len(hash) == 0 +} + +// @lc code=end + diff --git "a/Week_02/264.\344\270\221\346\225\260-ii.go" "b/Week_02/264.\344\270\221\346\225\260-ii.go" new file mode 100644 index 00000000..1ad371ba --- /dev/null +++ "b/Week_02/264.\344\270\221\346\225\260-ii.go" @@ -0,0 +1,51 @@ +/* + * @lc app=leetcode.cn id=264 lang=golang + * + * [264] 丑数 II + */ + +// @lc code=start +func nthUglyNumber(n int) int { + ret := -1 + var h IntHeap + heap.Init(&h) + heap.Push(&h, 1) + for n > 0 { + for h[0] == ret { + heap.Pop(&h) + } + ret = heap.Pop(&h).(int) + heap.Push(&h, 2*ret) + heap.Push(&h, 3*ret) + heap.Push(&h, 5*ret) + n-- + } + return ret +} + +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{} { + res := (*h)[len(*h)-1] + *h = (*h)[:len(*h)-1] + return res +} + +// @lc code=end + diff --git "a/Week_02/347.\345\211\215-k-\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.go" "b/Week_02/347.\345\211\215-k-\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.go" new file mode 100644 index 00000000..625c17bc --- /dev/null +++ "b/Week_02/347.\345\211\215-k-\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.go" @@ -0,0 +1,53 @@ +/* + * @lc app=leetcode.cn id=347 lang=golang + * + * [347] 前 K 个高频元素 + */ + +// @lc code=start +func topKFrequent(nums []int, k int) []int { + maps := make(map[int]int) + for _, num := range nums { + maps[num]++ + } + h := &MyHeap{} + heap.Init(h) + for num, count := range maps { + heap.Push(h, [2]int{num, count}) + if h.Len() > k { + heap.Pop(h) + } + } + ret := make([]int, k) + for i := 0; i < k; i++ { + ret[k-i-1] = heap.Pop(h).([2]int)[0] + } + return ret +} + +type MyHeap [][2]int + +func (h MyHeap) Len() int { + return len(h) +} + +func (h MyHeap) Less(i, j int) bool { + return h[i][1] < h[j][1] +} + +func (h MyHeap) Swap(i, j int) { + h[i], h[j] = h[j], h[i] +} + +func (h *MyHeap) Push(x interface{}) { + *h = append(*h, x.([2]int)) +} + +func (h *MyHeap) Pop() interface{} { + res := (*h)[len(*h)-1] + *h = (*h)[:len(*h)-1] + return res +} + +// @lc code=end + diff --git "a/Week_02/429.n\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.go" "b/Week_02/429.n\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.go" new file mode 100644 index 00000000..a38e604e --- /dev/null +++ "b/Week_02/429.n\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.go" @@ -0,0 +1,43 @@ +/* + * @lc app=leetcode.cn id=429 lang=golang + * + * [429] N叉树的层序遍历 + */ + +// @lc code=start +/** + * Definition for a Node. + * type Node struct { + * Val int + * Children []*Node + * } + */ + +var ret [][]int + +func levelOrder(root *Node) [][]int { + if root == nil { + return [][]int{} + } + ret = [][]int{} + dfs(root, 0) + return ret + +} + +func dfs(root *Node, level int) { + if root == nil { + return + } + if len(ret) == level { + ret = append(ret, []int{}) + } + + ret[level] = append(ret[level], root.Val) + for _, child := range root.Children { + dfs(child, level+1) + } +} + +// @lc code=end + diff --git "a/Week_02/49.\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204.go" "b/Week_02/49.\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204.go" new file mode 100644 index 00000000..08231aca --- /dev/null +++ "b/Week_02/49.\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204.go" @@ -0,0 +1,40 @@ +/* + * @lc app=leetcode.cn id=49 lang=golang + * + * [49] 字母异位词分组 + */ + +// @lc code=start +func groupAnagrams(strs []string) [][]string { + if len(strs) == 0 { + return [][]string{} + } + m := make(map[[26]int][]string) + for _, str := range strs { + k := strArray(str) + s, ok := m[k] + if !ok { + s = make([]string, 0) + } + s = append(s, str) + m[k] = s + } + + res := make([][]string, 0, len(m)) + for _, v := range m { + res = append(res, v) + } + return res + +} + +func strArray(s string) [26]int { + res := [26]int{} + for _, v := range s { + res[v-'a']++ + } + return res +} + +// @lc code=end + diff --git "a/Week_02/589.n\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.go" "b/Week_02/589.n\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.go" new file mode 100644 index 00000000..553e1eeb --- /dev/null +++ "b/Week_02/589.n\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.go" @@ -0,0 +1,29 @@ +/* + * @lc app=leetcode.cn id=589 lang=golang + * + * [589] N叉树的前序遍历 + */ + +// @lc code=start +/** + * Definition for a Node. + * type Node struct { + * Val int + * Children []*Node + * } + */ + +func preorder(root *Node) []int { + if root == nil { + return []int{} + } + var ret []int + ret = append(ret, root.Val) + for _, child := range root.Children { + ret = append(ret, preorder(child)...) + } + return ret +} + +// @lc code=end + diff --git "a/Week_02/94.\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.go" "b/Week_02/94.\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.go" new file mode 100644 index 00000000..87027475 --- /dev/null +++ "b/Week_02/94.\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.go" @@ -0,0 +1,26 @@ +/* + * @lc app=leetcode.cn id=94 lang=golang + * + * [94] 二叉树的中序遍历 + */ + +// @lc code=start +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func inorderTraversal(root *TreeNode) []int { + if root == nil { + return []int{} + } + r1 := inorderTraversal(root.Left) + r2 := inorderTraversal(root.Right) + return append(append(r1, root.Val), r2...) +} + +// @lc code=end + diff --git a/Week_02/README.md b/Week_02/README.md index 50de3041..da922fb7 100644 --- a/Week_02/README.md +++ b/Week_02/README.md @@ -1 +1,20 @@ -学习笔记 \ No newline at end of file +# 学习笔记 +1. 树的面试题解法一般都是**递归**,为什么? + * 问题分解具有重复性 + * 没有便于循环的结构 + * 有明确的终止条件 +2. 二叉搜索树: + * 左子树的**所有结点**均小于根结点的值 + * 右子树的**所有结点**均大于根结点的值 + * 重复性 +3. 前序、中序、后序遍历: + * 前序:中左右 + * 中序:左中右 + * 后序:左右中 +4. 二叉堆 + * 是一颗**完全二叉树** + * 树中任意结点的值 >= 其子结点的值 + * 索引为`i`的左孩子的索引为`2*i+1` + * 索引为`i`的右孩子的索引为`2*i+2` + * 索引为`i`的父结点索引为`floor( (i – 1) / 2 )` + \ No newline at end of file diff --git "a/Week_03/105.\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.go" "b/Week_03/105.\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.go" new file mode 100644 index 00000000..f5386794 --- /dev/null +++ "b/Week_03/105.\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.go" @@ -0,0 +1,40 @@ +/* + * @lc app=leetcode.cn id=105 lang=golang + * + * [105] 从前序与中序遍历序列构造二叉树 + */ + +// @lc code=start +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func buildTree(preorder []int, inorder []int) *TreeNode { + if len(preorder) == 0 { + return nil + } + root := &TreeNode{ + Val: preorder[0], + Left: nil, + Right: nil, + } + + var rootIndex int + for i := 0; i < len(inorder); i++ { + if inorder[i] == preorder[0] { + rootIndex = i + break + } + } + + root.Left = buildTree(preorder[1:len(inorder[:rootIndex])+1], inorder[:rootIndex]) + root.Right = buildTree(preorder[len(inorder[:rootIndex])+1:], inorder[rootIndex+1:]) + return root +} + +// @lc code=end + diff --git "a/Week_03/236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.go" "b/Week_03/236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.go" new file mode 100644 index 00000000..204ec71f --- /dev/null +++ "b/Week_03/236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.go" @@ -0,0 +1,34 @@ +/* + * @lc app=leetcode.cn id=236 lang=golang + * + * [236] 二叉树的最近公共祖先 + */ + +// @lc code=start +/** + * Definition for TreeNode. + * type TreeNode struct { + * Val int + * Left *ListNode + * Right *ListNode + * } + */ + func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { + if root == nil { + return nil + } + if root.Val == p.Val || root.Val == q.Val { + 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 +} +// @lc code=end + diff --git "a/Week_03/46.\345\205\250\346\216\222\345\210\227.go" "b/Week_03/46.\345\205\250\346\216\222\345\210\227.go" new file mode 100644 index 00000000..a30714cf --- /dev/null +++ "b/Week_03/46.\345\205\250\346\216\222\345\210\227.go" @@ -0,0 +1,36 @@ +/* + * @lc app=leetcode.cn id=46 lang=golang + * + * [46] 全排列 + */ + +// @lc code=start +func permute(nums []int) [][]int { + ret := [][]int{} + var used = make([]bool, len(nums)) + var path = make([]int, len(nums)) + var dfs func(int) + dfs = func(l int) { + for k := range used { + if !used[k] { + if l == len(nums) - 1 { + var tmp = make([]int, len(nums)) + copy(tmp, path) + tmp[l] = nums[k] + ret = append(ret, tmp) + return + }else { + used[k] = true + path[l] = nums[k] + dfs(l + 1) + used[k] = false + } + } + } + } + dfs(0) + return ret +} + +// @lc code=end + diff --git "a/Week_03/47.\345\205\250\346\216\222\345\210\227-ii.go" "b/Week_03/47.\345\205\250\346\216\222\345\210\227-ii.go" new file mode 100644 index 00000000..9511fd1f --- /dev/null +++ "b/Week_03/47.\345\205\250\346\216\222\345\210\227-ii.go" @@ -0,0 +1,34 @@ +/* + * @lc app=leetcode.cn id=47 lang=golang + * + * [47] 全排列 II + */ + +// @lc code=start +func permuteUnique(nums []int) [][]int { + ret := [][]int{} + var dfs func(int) + dfs = func(index int) { + if index == len(nums) { + temp := make([]int, len(nums)) + copy(temp, nums) + ret = append(ret, temp) + return + } + m := map[int]int{} + for i := index; i < len(nums); i++ { + if _, ok := m[nums[i]]; ok { + continue + } + nums[i], nums[index] = nums[index], nums[i] + dfs(index + 1) + nums[i], nums[index] = nums[index], nums[i] + m[nums[i]] = 1 + } + } + dfs(0) + return ret +} + +// @lc code=end + diff --git "a/Week_03/77.\347\273\204\345\220\210.go" "b/Week_03/77.\347\273\204\345\220\210.go" new file mode 100644 index 00000000..55f22204 --- /dev/null +++ "b/Week_03/77.\347\273\204\345\220\210.go" @@ -0,0 +1,28 @@ +/* + * @lc app=leetcode.cn id=77 lang=golang + * + * [77] 组合 + */ + +// @lc code=start +func combine(n int, k int) [][]int { + res := [][]int{} + var dfs func(int, []int) + dfs = func(index int, nums []int) { + if len(nums) == k { + t := make([]int, k) + copy(t, nums) + res = append(res, t) + return + } + for i := index; i <= n; i++ { + dfs(i+1, append(nums, i)) + } + } + + dfs(1, []int{}) + return res +} + +// @lc code=end + diff --git a/Week_03/README.md b/Week_03/README.md index 50de3041..126cfd9d 100644 --- a/Week_03/README.md +++ b/Week_03/README.md @@ -1 +1,20 @@ -学习笔记 \ No newline at end of file +# 学习笔记 +```go +// 模板 +result = [] +var dfs(路径,选择列表) +func dfs(路径,选择列表) { + if 满足结束条件 { + result = append(result,路径...) + } + return + + for 选择 in 选择列表 { + 做选择 + dfs(路径,选择列表) + 撤销选择 + } +} +dfs() +return result +``` diff --git "a/Week_04/122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272-ii.go" "b/Week_04/122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272-ii.go" new file mode 100644 index 00000000..ea01fabd --- /dev/null +++ "b/Week_04/122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272-ii.go" @@ -0,0 +1,28 @@ +/* + * @lc app=leetcode.cn id=122 lang=golang + * + * [122] 买卖股票的最佳时机 II + */ + +// @lc code=start +func maxProfit(prices []int) int { + maxValue := 0 + peak := prices[0] + valley := prices[0] + i := 0 + for i < len(prices)-1 { + for i < len(prices)-1 && prices[i] > prices[i+1] { + i++ + } + valley = prices[i] + for i < len(prices)-1 && prices[i] <= prices[i+1] { + i++ + } + peak = prices[i] + maxValue += peak - valley + } + return maxValue +} + +// @lc code=end + diff --git "a/Week_04/200.\345\262\233\345\261\277\346\225\260\351\207\217.go" "b/Week_04/200.\345\262\233\345\261\277\346\225\260\351\207\217.go" new file mode 100644 index 00000000..f76cb4b2 --- /dev/null +++ "b/Week_04/200.\345\262\233\345\261\277\346\225\260\351\207\217.go" @@ -0,0 +1,44 @@ +/* + * @lc app=leetcode.cn id=200 lang=golang + * + * [200] 岛屿数量 + */ + +// @lc code=start +func numIslands(grid [][]byte) int { + if len(grid) == 0 || len(grid[0]) == 0 { + return 0 + } + var ret = 0 + var dfs func(x, y int) + dfs = func(x, y int) { + if x < 0 || y < 0 { + return + } + if x >= len(grid) || y >= len(grid[0]) { + return + } + if grid[x][y] == '0' { + return + } + grid[x][y] = '0' + dfs(x-1, y) + dfs(x, y-1) + dfs(x+1, y) + dfs(x, y+1) + } + + for i := 0; i < len(grid); i++ { + for j := 0; j < len(grid[0]); j++ { + if grid[i][j] == '1' { + ret++ + dfs(i, j) + } + } + } + + return ret +} + +// @lc code=end + diff --git "a/Week_04/455.\345\210\206\345\217\221\351\245\274\345\271\262.go" "b/Week_04/455.\345\210\206\345\217\221\351\245\274\345\271\262.go" new file mode 100644 index 00000000..97472e8f --- /dev/null +++ "b/Week_04/455.\345\210\206\345\217\221\351\245\274\345\271\262.go" @@ -0,0 +1,23 @@ +/* + * @lc app=leetcode.cn id=455 lang=golang + * + * [455] 分发饼干 + */ + +// @lc code=start +func findContentChildren(g []int, s []int) int { + sort.Ints(g) + sort.Ints(s) + i := 0 + j := 0 + for i < len(g) && j < len(s) { + if g[i] <= s[j] { + i++ // 判断饼干是否能让孩子满足, 不能就一直等大的饼干 + } + j++ // 饼干一直在换大的 + } + return i +} + +// @lc code=end + diff --git "a/Week_04/860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.go" "b/Week_04/860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.go" new file mode 100644 index 00000000..d0949e87 --- /dev/null +++ "b/Week_04/860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.go" @@ -0,0 +1,41 @@ +/* + * @lc app=leetcode.cn id=860 lang=golang + * + * [860] 柠檬水找零 + */ + +// @lc code=start +func lemonadeChange(bills []int) bool { + m := make(map[int]int) + + for _, b := range bills { + if b == 5 { + m[5]++ + } + if b == 10 { + if m[5] > 0 { + m[5]-- + m[10]++ + } else { + return false + } + } + if b == 20 { + if m[10] > 0 && m[5] > 0 { + m[20]++ + m[10]-- + m[5]-- + } else if m[5] >= 3 { + m[20]++ + m[5] = m[5] - 3 + } else { + return false + } + } + } + + return true +} + +// @lc code=end + diff --git "a/Week_04/874.\346\250\241\346\213\237\350\241\214\350\265\260\346\234\272\345\231\250\344\272\272.go" "b/Week_04/874.\346\250\241\346\213\237\350\241\214\350\265\260\346\234\272\345\231\250\344\272\272.go" new file mode 100644 index 00000000..e08a4335 --- /dev/null +++ "b/Week_04/874.\346\250\241\346\213\237\350\241\214\350\265\260\346\234\272\345\231\250\344\272\272.go" @@ -0,0 +1,39 @@ +/* + * @lc app=leetcode.cn id=874 lang=golang + * + * [874] 模拟行走机器人 + */ + +// @lc code=start +func robotSim(commands []int, obstacles [][]int) int { + res := float64(0) + x, y := 0, 0 + stepX := []int{0, 1, 0, -1} // 在x轴上的距离 上右下左 + stepY := []int{1, 0, -1, 0} // 在y轴上的距离 上右下左 + cur := 0 // 上右下左 当前方向 向北 + m := make(map[string]bool) + for _, v := range obstacles { + m[fmt.Sprintf("%d-%d", v[0], v[1])] = true + } + for i := 0; i < len(commands); i++ { + switch commands[i] { + case -1: + cur = (cur + 1) % 4 // 右转 + case -2: + cur = (cur + 3) % 4 // 左转 + default: + for j := 0; j < commands[i]; j++ { + tmpX, tmpY := x+stepX[cur], y+stepY[cur] // 每次循环走一个格子 + if m[fmt.Sprintf("%d-%d", tmpX, tmpY)] { // 遇到障碍物 + break + } + x, y = tmpX, tmpY + res = math.Max(float64(x*x+y*y), res) + } + } + } + return int(res) +} + +// @lc code=end + diff --git a/Week_04/README.md b/Week_04/README.md index 50de3041..91ce76f1 100644 --- a/Week_04/README.md +++ b/Week_04/README.md @@ -1 +1,49 @@ -学习笔记 \ No newline at end of file +# 学习笔记 +```go +// dfs模板 +res := returnValue +var dfs func(...) +dfs = func(...) { + if returnCondition { + res = append(res, ...) + } + thisLevelDo + dfs(...) +} +dfs(.) +return returnValue +``` + +```go +// bfs模板 +res := returnValue +queue := []type{firstElem} +for len(queue) != 0 { + size := len(queue) + levelValueInit + for i := 0; i < size; i++ { + curElem := queue[0] + queue[1:] + DoSomething with curElem { + queue = append(queue, ...) + } + } + levelValueHandler +} +return returnValue +``` + +```go +// 二分 +left, right := 0, len(list) - 1 +for left <= right { + mid := left + (right - left) / 2 + if mid == target { + return mid + } else mid < target { + left = mid + 1 + } else { + right = mid - 1 + } +} +```