From d7b7fbc551848d80a2435d411529d256820eb539 Mon Sep 17 00:00:00 2001 From: liuchen Date: Tue, 20 Oct 2020 21:44:23 +0800 Subject: [PATCH 01/29] up --- week01/01_NOTE.md | 30 ++++++++++++++++++ week01/datastruct_algorithm.png | Bin 0 -> 211858 bytes .../Solution.java | 28 ++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 week01/01_NOTE.md create mode 100644 week01/datastruct_algorithm.png create mode 100644 week01/q26_remove_duplicates_from_sorted_array/Solution.java diff --git a/week01/01_NOTE.md b/week01/01_NOTE.md new file mode 100644 index 00000000..ea74a84a --- /dev/null +++ b/week01/01_NOTE.md @@ -0,0 +1,30 @@ +# 数据结构 +* 一维 + * 数组 array + * 链表 linked list + * 栈 stack + * 队列 queue + * 双端队列 deque + * 集合 set + * 字典 map +* 二维 + * 树 tree + * 图 graph + * 二叉搜索树 binary search tree + * 堆 heap + * 并查集 disjoint set + * 字典树 trie +* 特殊 + * 位运算 Bitwise + * 布隆过滤器 BloomFilter + * LRU cache + +# 算法 +* branch : if-else, switch +* iteration : for, while, loop +* 递归 recursion +* 搜索 search : 深度优先 Depth first search, 广度优先 Breadth first search +* 动态规划 Dynamic Progreamming +* 二分查找 Binary search +* 贪心 Greedy +* 数学 Math, 几何 Geometry \ No newline at end of file diff --git a/week01/datastruct_algorithm.png b/week01/datastruct_algorithm.png new file mode 100644 index 0000000000000000000000000000000000000000..edeab08e38c06aaa8b15c4b2acf52bdaf8caa685 GIT binary patch literal 211858 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 z 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 literal 0 HcmV?d00001 diff --git a/week01/q26_remove_duplicates_from_sorted_array/Solution.java b/week01/q26_remove_duplicates_from_sorted_array/Solution.java new file mode 100644 index 00000000..d8cd3904 --- /dev/null +++ b/week01/q26_remove_duplicates_from_sorted_array/Solution.java @@ -0,0 +1,28 @@ +package q26_remove_duplicates_from_sorted_array; + +/** + * @Description: + * @Author: liuchen created at 21:12 2020-10-20 + */ +public class Solution { + public int removeDuplicates(int[] nums) { + if (nums.length < 2) { + return nums.length; + } + int j = 0; + for (int i = 1; i < nums.length; i++) { + if (nums[i] != nums[j]) { + ++j; + nums[j] = nums[i]; + } + } + return j + 1; + } + + public static void main(String[] args) { + int[] nums = new int[]{0, 0, 1, 1, 1, 2, 2, 3, 3, 4}; + Solution s = new Solution(); + int len = s.removeDuplicates(nums); + System.out.println(len); + } +} From afabddc9996fb5cc5571fad2dbee0bf9f35ef6a2 Mon Sep 17 00:00:00 2001 From: liuchen Date: Thu, 22 Oct 2020 14:45:13 +0800 Subject: [PATCH 02/29] up --- week01/01_NOTE.md | 30 ----------------- week01/NOTE.md | 48 ++++++++++++++++++++++++++- week01/q283_move_zeroes/Solution.java | 30 +++++++++++++++++ 3 files changed, 77 insertions(+), 31 deletions(-) delete mode 100644 week01/01_NOTE.md create mode 100644 week01/q283_move_zeroes/Solution.java diff --git a/week01/01_NOTE.md b/week01/01_NOTE.md deleted file mode 100644 index ea74a84a..00000000 --- a/week01/01_NOTE.md +++ /dev/null @@ -1,30 +0,0 @@ -# 数据结构 -* 一维 - * 数组 array - * 链表 linked list - * 栈 stack - * 队列 queue - * 双端队列 deque - * 集合 set - * 字典 map -* 二维 - * 树 tree - * 图 graph - * 二叉搜索树 binary search tree - * 堆 heap - * 并查集 disjoint set - * 字典树 trie -* 特殊 - * 位运算 Bitwise - * 布隆过滤器 BloomFilter - * LRU cache - -# 算法 -* branch : if-else, switch -* iteration : for, while, loop -* 递归 recursion -* 搜索 search : 深度优先 Depth first search, 广度优先 Breadth first search -* 动态规划 Dynamic Progreamming -* 二分查找 Binary search -* 贪心 Greedy -* 数学 Math, 几何 Geometry \ No newline at end of file diff --git a/week01/NOTE.md b/week01/NOTE.md index 50de3041..2a0be2b7 100644 --- a/week01/NOTE.md +++ b/week01/NOTE.md @@ -1 +1,47 @@ -学习笔记 \ No newline at end of file +# 数据结构 +* 一维 + * 数组 array + * 链表 linked list + * 栈 stack + * 队列 queue + * 双端队列 deque + * 集合 set + * 字典 map +* 二维 + * 树 tree + * 图 graph + * 二叉搜索树 binary search tree + * 堆 heap + * 并查集 disjoint set + * 字典树 trie +* 特殊 + * 位运算 Bitwise + * 布隆过滤器 BloomFilter + * LRU cache + +# 算法 +* branch : if-else, switch +* iteration : for, while, loop +* 递归 recursion +* 搜索 search : 深度优先 Depth first search, 广度优先 Breadth first search +* 动态规划 Dynamic Progreamming +* 二分查找 Binary search +* 贪心 Greedy +* 数学 Math, 几何 Geometry + +# 数组 +* prepend O(1) +* append O(1) +* lookup O(1) +* insert O(n) +* delete O(n) +# 链表 +* prepend O(1) +* append O(1) +* lookup O(n) +* insert O(1) +* delete O(1) +# 跳表 +* 有序链表 +* 对标 平衡树/二分查找 +* insert/delete/lookup O(log n) \ No newline at end of file diff --git a/week01/q283_move_zeroes/Solution.java b/week01/q283_move_zeroes/Solution.java new file mode 100644 index 00000000..c76bf235 --- /dev/null +++ b/week01/q283_move_zeroes/Solution.java @@ -0,0 +1,30 @@ +package q283_move_zeroes; + +import java.util.Arrays; + +/** + * @Description: + * @Author: liuchen created at 09:49 2020-10-22 + */ +public class Solution { + + public void moveZeroes(int[] nums) { + int j = 0; + for (int i = 0; i < nums.length; i++) { + if (nums[i] != 0) { + nums[j] = nums[i]; + if (i != j) { + nums[i] = 0; + } + j++; + } + } + } + + public static void main(String[] args) { + int[] nums = new int[]{0, 1, 0, 3, 12}; + Solution s = new Solution(); + s.moveZeroes(nums); + System.out.println(Arrays.toString(nums)); + } +} From 5c991d14b3cca44c456991a2d04ce602b15f5144 Mon Sep 17 00:00:00 2001 From: liuchen Date: Thu, 22 Oct 2020 20:21:57 +0800 Subject: [PATCH 03/29] add two-sum --- week01/q1_two_sum/Solution.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 week01/q1_two_sum/Solution.java diff --git a/week01/q1_two_sum/Solution.java b/week01/q1_two_sum/Solution.java new file mode 100644 index 00000000..9fd1bd3a --- /dev/null +++ b/week01/q1_two_sum/Solution.java @@ -0,0 +1,22 @@ +package q1_two_sum; + +import java.util.HashMap; + +/** + * @Description: + * @Author: liuchen created at 14:29 2020-09-30 + */ +public class Solution { + public int[] twoSum(int[] nums, int target) { + HashMap map = new HashMap<>(nums.length); + for (int i = 0; i Date: Mon, 26 Oct 2020 11:18:28 +0800 Subject: [PATCH 04/29] up --- week01/NOTE.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/week01/NOTE.md b/week01/NOTE.md index 2a0be2b7..0a60ac20 100644 --- a/week01/NOTE.md +++ b/week01/NOTE.md @@ -44,4 +44,20 @@ # 跳表 * 有序链表 * 对标 平衡树/二分查找 -* insert/delete/lookup O(log n) \ No newline at end of file +* insert/delete/lookup O(log n) +# 栈 stack +* 先进后出 +* insert/delete O(1) +* lookup O(n) +# 队列 queue +* 先进先出 +* insert/delete O(1) +* lookup O(n) +# 双端队列 Deque +* Double-End Queue +* insert/delete O(1) +* lookup O(n) +# Priority Queue +* 插入 O(1) +* 取出 O(logN) +* 底层实现复杂多样 From 86a75fe8434bd45ef24a0f74907b14c078bee649 Mon Sep 17 00:00:00 2001 From: liuchen Date: Tue, 27 Oct 2020 07:21:27 +0800 Subject: [PATCH 05/29] up --- week02/NOTE.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/week02/NOTE.md b/week02/NOTE.md index 50de3041..94c90d26 100644 --- a/week02/NOTE.md +++ b/week02/NOTE.md @@ -1 +1,8 @@ -学习笔记 \ No newline at end of file +学习笔记 +# 哈希表 Hash table +* 碰撞 + * 不同值,hash后相同 + * 解决方案,节点变链表 + * size越小,越容易碰撞,时间复杂度越高 + +* insert/search/delete O(1) \ No newline at end of file From e96e501838141d2c3aef3ada0bf8238c207ffe97 Mon Sep 17 00:00:00 2001 From: liuchen Date: Wed, 28 Oct 2020 22:24:49 +0800 Subject: [PATCH 06/29] up --- week02/NOTE.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/week02/NOTE.md b/week02/NOTE.md index 94c90d26..1deb2791 100644 --- a/week02/NOTE.md +++ b/week02/NOTE.md @@ -5,4 +5,12 @@ * 解决方案,节点变链表 * size越小,越容易碰撞,时间复杂度越高 -* insert/search/delete O(1) \ No newline at end of file +* insert/search/delete O(1) + +# 树 +* 二叉树 + * 前序遍历(Pre-order):根-左-右 + * 中序遍历(In-order):左-根-右 + * 后序遍历(Post-order):左-右-根 +* 二叉搜索树 + * insert/search/delete O(log n) \ No newline at end of file From fd65d7604b19f53646e5f4e21b67267a18681048 Mon Sep 17 00:00:00 2001 From: liuchen Date: Thu, 29 Oct 2020 13:31:43 +0800 Subject: [PATCH 07/29] up --- .../Solution.java | 27 +++++++++++++++++ .../TreeNode.java | 18 ++++++++++++ .../Node.java | 23 +++++++++++++++ .../Solution.java | 29 +++++++++++++++++++ .../Node.java | 23 +++++++++++++++ .../Solution.java | 29 +++++++++++++++++++ .../Solution.java | 28 ++++++++++++++++++ .../TreeNode.java | 18 ++++++++++++ 8 files changed, 195 insertions(+) create mode 100644 week02/q144_binary_tree_preorder_traversal/Solution.java create mode 100644 week02/q144_binary_tree_preorder_traversal/TreeNode.java create mode 100644 week02/q589_n_ary_tree_preorder_traversal/Node.java create mode 100644 week02/q589_n_ary_tree_preorder_traversal/Solution.java create mode 100644 week02/q590_n_ary_tree_postorder_traversal/Node.java create mode 100644 week02/q590_n_ary_tree_postorder_traversal/Solution.java create mode 100644 week02/q94_binary_tree_inorder_traversal/Solution.java create mode 100644 week02/q94_binary_tree_inorder_traversal/TreeNode.java diff --git a/week02/q144_binary_tree_preorder_traversal/Solution.java b/week02/q144_binary_tree_preorder_traversal/Solution.java new file mode 100644 index 00000000..f6725605 --- /dev/null +++ b/week02/q144_binary_tree_preorder_traversal/Solution.java @@ -0,0 +1,27 @@ +package q144_binary_tree_preorder_traversal; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: liuchen created at 22:37 2020-10-28 + */ +public class Solution { + private List list; + + public List preorderTraversal(TreeNode root) { + this.list = new ArrayList<>(); + this.preorder(root); + return list; + } + + private void preorder(TreeNode node) { + if (node == null) { + return; + } + this.list.add(node.val); + this.preorder(node.left); + this.preorder(node.right); + } +} diff --git a/week02/q144_binary_tree_preorder_traversal/TreeNode.java b/week02/q144_binary_tree_preorder_traversal/TreeNode.java new file mode 100644 index 00000000..bf058deb --- /dev/null +++ b/week02/q144_binary_tree_preorder_traversal/TreeNode.java @@ -0,0 +1,18 @@ +package q144_binary_tree_preorder_traversal; + +/** + * @Description: + * @Author: liuchen created at 22:38 2020-10-28 + */ +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + TreeNode() {} + TreeNode(int val) { this.val = val; } + TreeNode(int val, TreeNode left, TreeNode right) { + this.val = val; + this.left = left; + this.right = right; + } +} diff --git a/week02/q589_n_ary_tree_preorder_traversal/Node.java b/week02/q589_n_ary_tree_preorder_traversal/Node.java new file mode 100644 index 00000000..2ae8c631 --- /dev/null +++ b/week02/q589_n_ary_tree_preorder_traversal/Node.java @@ -0,0 +1,23 @@ +package q589_n_ary_tree_preorder_traversal; + +import java.util.List; + +/** + * @Description: + * @Author: liuchen created at 22:55 2020-10-28 + */ +class Node { + public int val; + public List children; + + public Node() {} + + public Node(int _val) { + val = _val; + } + + public Node(int _val, List _children) { + val = _val; + children = _children; + } +} diff --git a/week02/q589_n_ary_tree_preorder_traversal/Solution.java b/week02/q589_n_ary_tree_preorder_traversal/Solution.java new file mode 100644 index 00000000..a5852c42 --- /dev/null +++ b/week02/q589_n_ary_tree_preorder_traversal/Solution.java @@ -0,0 +1,29 @@ +package q589_n_ary_tree_preorder_traversal; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: liuchen created at 22:56 2020-10-28 + */ +public class Solution { + + private List list; + + public List preorder(Node root) { + this.list = new ArrayList<>(); + this.preOrderNode(root); + return this.list; + } + + private void preOrderNode(Node node) { + if (node == null) { + return; + } + this.list.add(node.val); + for(int i=0;i children; + + public Node() {} + + public Node(int _val) { + val = _val; + } + + public Node(int _val, List _children) { + val = _val; + children = _children; + } +} diff --git a/week02/q590_n_ary_tree_postorder_traversal/Solution.java b/week02/q590_n_ary_tree_postorder_traversal/Solution.java new file mode 100644 index 00000000..1c461fbb --- /dev/null +++ b/week02/q590_n_ary_tree_postorder_traversal/Solution.java @@ -0,0 +1,29 @@ +package q590_n_ary_tree_postorder_traversal; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: liuchen created at 22:43 2020-10-28 + */ +public class Solution { + + private List list; + + public List postorder(Node root) { + this.list = new ArrayList<>(); + this.postOrderNode(root); + return list; + } + + private void postOrderNode(Node node) { + if (node == null) { + return; + } + for(int i = 0;i list; + + public List inorderTraversal(TreeNode root) { + this.list = new ArrayList<>(); + this.inOrder(root); + return list; + } + + private void inOrder(TreeNode root) { + if (root == null) { + return; + } + this.inOrder(root.left); + this.list.add(root.val); + this.inOrder(root.right); + } +} diff --git a/week02/q94_binary_tree_inorder_traversal/TreeNode.java b/week02/q94_binary_tree_inorder_traversal/TreeNode.java new file mode 100644 index 00000000..931b7638 --- /dev/null +++ b/week02/q94_binary_tree_inorder_traversal/TreeNode.java @@ -0,0 +1,18 @@ +package q94_binary_tree_inorder_traversal; + +/** + * @Description: + * @Author: liuchen created at 22:26 2020-10-28 + */ +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + TreeNode() {} + TreeNode(int val) { this.val = val; } + TreeNode(int val, TreeNode left, TreeNode right) { + this.val = val; + this.left = left; + this.right = right; + } +} From 89fb588f3b589eded15cac1858bc70ecbc205b3b Mon Sep 17 00:00:00 2001 From: liuchen Date: Thu, 29 Oct 2020 23:28:28 +0800 Subject: [PATCH 08/29] up --- week02/Solution.java | 31 +++++++++++++++++++++++ week02/Solution2.java | 42 ++++++++++++++++++++++++++++++++ week02/q1_two_sum/Solution.java | 30 +++++++++++++++++++++++ week02/q1_two_sum/Solution2.java | 28 +++++++++++++++++++++ week02/q1_two_sum/Solution3.java | 32 ++++++++++++++++++++++++ week02/q1_two_sum/Solution4.java | 28 +++++++++++++++++++++ 6 files changed, 191 insertions(+) create mode 100644 week02/Solution.java create mode 100644 week02/Solution2.java create mode 100644 week02/q1_two_sum/Solution.java create mode 100644 week02/q1_two_sum/Solution2.java create mode 100644 week02/q1_two_sum/Solution3.java create mode 100644 week02/q1_two_sum/Solution4.java diff --git a/week02/Solution.java b/week02/Solution.java new file mode 100644 index 00000000..1f673f8f --- /dev/null +++ b/week02/Solution.java @@ -0,0 +1,31 @@ +package q242_valid_anagram; + +import java.util.HashMap; + +/** + * @Description: + * @Author: liuchen created at 23:04 2020-10-29 + */ +public class Solution { + public boolean isAnagram(String s, String t) { + HashMap map = new HashMap<>(s.length()); + for(int i = 0;i map = new HashMap<>(26); + for(int i = 0;i map = new HashMap<>(nums.length); + for (int i = 0; i < nums.length; ++i) { + int n = target - nums[i]; + if (map.containsKey(n)) { + return new int[]{map.get(n), i}; + } else { + map.put(nums[i], i); + } + } + return new int[]{}; + } + + public static void main(String[] args) { + int[] nums = new int[]{2, 7, 11, 15}; + int target = 9; + Solution s = new Solution(); + System.out.println(Arrays.toString(s.twoSum(nums, target))); + } +} diff --git a/week02/q1_two_sum/Solution2.java b/week02/q1_two_sum/Solution2.java new file mode 100644 index 00000000..26e28602 --- /dev/null +++ b/week02/q1_two_sum/Solution2.java @@ -0,0 +1,28 @@ +package q1_two_sum; + +import java.util.Arrays; +import java.util.HashMap; + +/** + * @Description: + * @Author: liuchen created at 14:29 2020-09-30 + */ +public class Solution2 { + public int[] twoSum(int[] nums, int target) { + HashMap map = new HashMap<>(nums.length); + for (int i = 0; i < nums.length; ++i) { + if (map.containsKey(nums[i])) { + return new int[]{map.get(nums[i]), i}; + } + map.put(target - nums[i], i); + } + return new int[]{}; + } + + public static void main(String[] args) { + int[] nums = new int[]{2, 7, 11, 15}; + int target = 9; + Solution2 s = new Solution2(); + System.out.println(Arrays.toString(s.twoSum(nums, target))); + } +} diff --git a/week02/q1_two_sum/Solution3.java b/week02/q1_two_sum/Solution3.java new file mode 100644 index 00000000..e1248128 --- /dev/null +++ b/week02/q1_two_sum/Solution3.java @@ -0,0 +1,32 @@ +package q1_two_sum; + +import java.util.Arrays; +import java.util.HashMap; + +/** + * @Description: + * @Author: liuchen created at 14:29 2020-09-30 + */ +public class Solution3 { + public int[] twoSum(int[] nums, int target) { + if (nums.length < 1) { + return new int[]{}; + } + HashMap map = new HashMap<>(nums.length); + for (int i = 0; i < nums.length; i++) { + if (map.containsKey(nums[i])) { + return new int[]{map.get(nums[i]), i}; + } else { + map.put(target - nums[i], i); + } + } + return new int[]{}; + } + + public static void main(String[] args) { + int[] nums = new int[]{2, 7, 11, 15}; + int target = 9; + Solution3 s = new Solution3(); + System.out.println(Arrays.toString(s.twoSum(nums, target))); + } +} diff --git a/week02/q1_two_sum/Solution4.java b/week02/q1_two_sum/Solution4.java new file mode 100644 index 00000000..3efa09d9 --- /dev/null +++ b/week02/q1_two_sum/Solution4.java @@ -0,0 +1,28 @@ +package q1_two_sum; + +import java.util.Arrays; +import java.util.HashMap; + +/** + * @Description: + * @Author: liuchen created at 14:29 2020-09-30 + */ +public class Solution4 { + public int[] twoSum(int[] nums, int target) { + HashMap map = new HashMap<>(nums.length); + for(int i =0;i Date: Thu, 29 Oct 2020 23:28:56 +0800 Subject: [PATCH 09/29] up --- week02/{ => q242_valid_anagram}/Solution.java | 0 week02/{ => q242_valid_anagram}/Solution2.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename week02/{ => q242_valid_anagram}/Solution.java (100%) rename week02/{ => q242_valid_anagram}/Solution2.java (100%) diff --git a/week02/Solution.java b/week02/q242_valid_anagram/Solution.java similarity index 100% rename from week02/Solution.java rename to week02/q242_valid_anagram/Solution.java diff --git a/week02/Solution2.java b/week02/q242_valid_anagram/Solution2.java similarity index 100% rename from week02/Solution2.java rename to week02/q242_valid_anagram/Solution2.java From 2844e6b5ca5ff2a948256df39241deef3bdbca92 Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 31 Oct 2020 16:27:02 +0800 Subject: [PATCH 10/29] up for week2 --- week02/NOTE.md | 30 +++++++++++++- .../Solution.java | 19 ++++++++- .../Solution2.java | 40 +++++++++++++++++++ week02/q1_two_sum/Solution.java | 11 ++++- week02/q1_two_sum/Solution2.java | 28 ------------- week02/q1_two_sum/Solution3.java | 32 --------------- week02/q1_two_sum/Solution4.java | 28 ------------- week02/q242_valid_anagram/Solution.java | 29 ++++++++++++-- week02/q242_valid_anagram/Solution2.java | 12 +++++- .../Solution.java | 30 ++++++++++++-- .../Solution.java | 30 ++++++++++++-- .../Solution.java | 18 ++++++++- 12 files changed, 203 insertions(+), 104 deletions(-) create mode 100644 week02/q144_binary_tree_preorder_traversal/Solution2.java delete mode 100644 week02/q1_two_sum/Solution2.java delete mode 100644 week02/q1_two_sum/Solution3.java delete mode 100644 week02/q1_two_sum/Solution4.java diff --git a/week02/NOTE.md b/week02/NOTE.md index 1deb2791..11791e6f 100644 --- a/week02/NOTE.md +++ b/week02/NOTE.md @@ -1,4 +1,3 @@ -学习笔记 # 哈希表 Hash table * 碰撞 * 不同值,hash后相同 @@ -13,4 +12,31 @@ * 中序遍历(In-order):左-根-右 * 后序遍历(Post-order):左-右-根 * 二叉搜索树 - * insert/search/delete O(log n) \ No newline at end of file + * insert/search/delete O(log n) + +# 堆 Heap +* 迅速找到 MIN或MAX +* 二叉堆 (完全二叉树) +* fib堆 +* 大顶堆 + * find-max O(1) + * delete-max O(logN) + * insert/create O(logN) / O(1) +* 放到数组里 + * 索引为i的左子的索引是:2*i+1 + * 索引为i的右子的索引是:2*i+2 + * 索引为i的父的索引是:floor((i-1)/2) +* insert + * 放到最尾部 + * 逐步向上做替换,if > 父, 和父替换 (heapifyUp) + * 最大操作数为树的深度,即O(logN) +* delete-max + * 移除顶部元素 + * 将尾部元素i放到顶部 + * 逐步将i与左右子中大者替换 (heapifyDown) + * 最大操作数为树的深度,即O(logN) +* 工程中-优先级队列(priority_queue) + +# 图 Graph(V, E) +* V - vertex: 点 +* E - edge: 边 \ No newline at end of file diff --git a/week02/q144_binary_tree_preorder_traversal/Solution.java b/week02/q144_binary_tree_preorder_traversal/Solution.java index f6725605..c0b8e6e7 100644 --- a/week02/q144_binary_tree_preorder_traversal/Solution.java +++ b/week02/q144_binary_tree_preorder_traversal/Solution.java @@ -4,7 +4,14 @@ import java.util.List; /** - * @Description: + * 二叉树的前序遍历 + *

+ * Solution1: 递归, 按前序遍历-根左右 + * Solution2: 迭代 + *

+ * Time: O(n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ * @Author: liuchen created at 22:37 2020-10-28 */ public class Solution { @@ -24,4 +31,14 @@ private void preorder(TreeNode node) { this.preorder(node.left); this.preorder(node.right); } + + public static void main(String[] args) { + TreeNode n3 = new TreeNode(3); + TreeNode n2 = new TreeNode(2); + n2.left = n3; + TreeNode n1 = new TreeNode(1); + n1.right = n2; + Solution s = new Solution(); + System.out.println(s.preorderTraversal(n1)); + } } diff --git a/week02/q144_binary_tree_preorder_traversal/Solution2.java b/week02/q144_binary_tree_preorder_traversal/Solution2.java new file mode 100644 index 00000000..95b0bd63 --- /dev/null +++ b/week02/q144_binary_tree_preorder_traversal/Solution2.java @@ -0,0 +1,40 @@ +package q144_binary_tree_preorder_traversal; + +import java.util.ArrayList; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; + +/** + * @Author: liuchen created at 22:37 2020-10-28 + */ +public class Solution2 { + public List preorderTraversal(TreeNode root) { + List list = new ArrayList<>(); + if (root == null) { + return list; + } + Deque stack = new LinkedList<>(); + TreeNode node = root; + while (!stack.isEmpty() || node != null) { + while (node != null) { + list.add(node.val); + stack.push(node); + node = node.left; + } + node = stack.pop(); + node = node.right; + } + return list; + } + + public static void main(String[] args) { + TreeNode n3 = new TreeNode(3); + TreeNode n2 = new TreeNode(2); + n2.left = n3; + TreeNode n1 = new TreeNode(1); + n1.right = n2; + Solution2 s = new Solution2(); + System.out.println(s.preorderTraversal(n1)); + } +} diff --git a/week02/q1_two_sum/Solution.java b/week02/q1_two_sum/Solution.java index e6515f56..ac6a1e6d 100644 --- a/week02/q1_two_sum/Solution.java +++ b/week02/q1_two_sum/Solution.java @@ -4,10 +4,17 @@ import java.util.HashMap; /** - * @Description: + * 两数之和 + * + * 遍历nums, 同时生成map(key = target - num[i], val = i) + * + * Time: O(n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/two-sum/ * @Author: liuchen created at 14:29 2020-09-30 */ public class Solution { + public int[] twoSum(int[] nums, int target) { HashMap map = new HashMap<>(nums.length); for (int i = 0; i < nums.length; ++i) { @@ -18,7 +25,7 @@ public int[] twoSum(int[] nums, int target) { map.put(nums[i], i); } } - return new int[]{}; + return new int[0]; } public static void main(String[] args) { diff --git a/week02/q1_two_sum/Solution2.java b/week02/q1_two_sum/Solution2.java deleted file mode 100644 index 26e28602..00000000 --- a/week02/q1_two_sum/Solution2.java +++ /dev/null @@ -1,28 +0,0 @@ -package q1_two_sum; - -import java.util.Arrays; -import java.util.HashMap; - -/** - * @Description: - * @Author: liuchen created at 14:29 2020-09-30 - */ -public class Solution2 { - public int[] twoSum(int[] nums, int target) { - HashMap map = new HashMap<>(nums.length); - for (int i = 0; i < nums.length; ++i) { - if (map.containsKey(nums[i])) { - return new int[]{map.get(nums[i]), i}; - } - map.put(target - nums[i], i); - } - return new int[]{}; - } - - public static void main(String[] args) { - int[] nums = new int[]{2, 7, 11, 15}; - int target = 9; - Solution2 s = new Solution2(); - System.out.println(Arrays.toString(s.twoSum(nums, target))); - } -} diff --git a/week02/q1_two_sum/Solution3.java b/week02/q1_two_sum/Solution3.java deleted file mode 100644 index e1248128..00000000 --- a/week02/q1_two_sum/Solution3.java +++ /dev/null @@ -1,32 +0,0 @@ -package q1_two_sum; - -import java.util.Arrays; -import java.util.HashMap; - -/** - * @Description: - * @Author: liuchen created at 14:29 2020-09-30 - */ -public class Solution3 { - public int[] twoSum(int[] nums, int target) { - if (nums.length < 1) { - return new int[]{}; - } - HashMap map = new HashMap<>(nums.length); - for (int i = 0; i < nums.length; i++) { - if (map.containsKey(nums[i])) { - return new int[]{map.get(nums[i]), i}; - } else { - map.put(target - nums[i], i); - } - } - return new int[]{}; - } - - public static void main(String[] args) { - int[] nums = new int[]{2, 7, 11, 15}; - int target = 9; - Solution3 s = new Solution3(); - System.out.println(Arrays.toString(s.twoSum(nums, target))); - } -} diff --git a/week02/q1_two_sum/Solution4.java b/week02/q1_two_sum/Solution4.java deleted file mode 100644 index 3efa09d9..00000000 --- a/week02/q1_two_sum/Solution4.java +++ /dev/null @@ -1,28 +0,0 @@ -package q1_two_sum; - -import java.util.Arrays; -import java.util.HashMap; - -/** - * @Description: - * @Author: liuchen created at 14:29 2020-09-30 - */ -public class Solution4 { - public int[] twoSum(int[] nums, int target) { - HashMap map = new HashMap<>(nums.length); - for(int i =0;i + * 再循环t, 判断char是否存在map, 不存在return false, 存在v--, v为0时,删除map.char + * 最后map.size == 0则为true + * + * Time: O(2n) + * Space: O(n) + * + * Optimise:(Solution2) + * 1. 定义map长度26, 26个字母 + * 2. O(2n) -> O(n), 同时循环s和t + * + * @Link: https://leetcode-cn.com/problems/valid-anagram/description/ * @Author: liuchen created at 23:04 2020-10-29 */ public class Solution { public boolean isAnagram(String s, String t) { HashMap map = new HashMap<>(s.length()); - for(int i = 0;i map = new HashMap<>(26); - for(int i = 0;i + * Solution: 参考 前序遍历-根左右,改为根子,即可 + * + * @Link: https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/ * @Author: liuchen created at 22:56 2020-10-28 */ public class Solution { @@ -22,8 +26,28 @@ private void preOrderNode(Node node) { return; } this.list.add(node.val); - for(int i=0;i n3Children = new ArrayList<>(2); + n3Children.add(n5); + n3Children.add(n6); + Node n3 = new Node(3, n3Children); + Node n2 = new Node(2); + Node n4 = new Node(4); + List n1Children = new ArrayList<>(3); + n1Children.add(n3); + n1Children.add(n2); + n1Children.add(n4); + Node n1 = new Node(1, n1Children); + Solution s = new Solution(); + System.out.println(s.preorder(n1)); + } } diff --git a/week02/q590_n_ary_tree_postorder_traversal/Solution.java b/week02/q590_n_ary_tree_postorder_traversal/Solution.java index 1c461fbb..11b6dcfb 100644 --- a/week02/q590_n_ary_tree_postorder_traversal/Solution.java +++ b/week02/q590_n_ary_tree_postorder_traversal/Solution.java @@ -4,7 +4,11 @@ import java.util.List; /** - * @Description: + * N叉树的后序遍历 + *

+ * Solution: 参考 后序遍历-左右根,改为子根,即可 + * + * @Link: https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/ * @Author: liuchen created at 22:43 2020-10-28 */ public class Solution { @@ -21,9 +25,29 @@ private void postOrderNode(Node node) { if (node == null) { return; } - for(int i = 0;i n3Children = new ArrayList<>(2); + n3Children.add(n5); + n3Children.add(n6); + Node n3 = new Node(3, n3Children); + Node n2 = new Node(2); + Node n4 = new Node(4); + List n1Children = new ArrayList<>(3); + n1Children.add(n3); + n1Children.add(n2); + n1Children.add(n4); + Node n1 = new Node(1, n1Children); + Solution s = new Solution(); + System.out.println(s.postorder(n1)); + } } diff --git a/week02/q94_binary_tree_inorder_traversal/Solution.java b/week02/q94_binary_tree_inorder_traversal/Solution.java index b37764ff..3af4933d 100644 --- a/week02/q94_binary_tree_inorder_traversal/Solution.java +++ b/week02/q94_binary_tree_inorder_traversal/Solution.java @@ -4,7 +4,13 @@ import java.util.List; /** - * @Description: + * 二叉树的中序遍历 + *

+ * Solution: 参考 中序遍历-左根右 + *

+ * Time: O(n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ * @Author: liuchen created at 22:26 2020-10-28 */ public class Solution { @@ -25,4 +31,14 @@ private void inOrder(TreeNode root) { this.list.add(root.val); this.inOrder(root.right); } + + public static void main(String[] args) { + TreeNode n3 = new TreeNode(3); + TreeNode n2 = new TreeNode(2); + n2.left = n3; + TreeNode n1 = new TreeNode(1); + n1.right = n2; + Solution s = new Solution(); + System.out.println(s.inorderTraversal(n1)); + } } From 9ba4b2d0f761cb1519fd329d35cc25788f02b60e Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 31 Oct 2020 17:58:20 +0800 Subject: [PATCH 11/29] up for week2 --- .../Node.java | 23 +++++++ .../Solution.java | 60 +++++++++++++++++++ .../Solution2.java | 49 +++++++++++++++ week02/q49_group_anagrams/Solution.java | 60 +++++++++++++++++++ 4 files changed, 192 insertions(+) create mode 100644 week02/q429_n_ary_tree_level_order_traversal/Node.java create mode 100644 week02/q429_n_ary_tree_level_order_traversal/Solution.java create mode 100644 week02/q429_n_ary_tree_level_order_traversal/Solution2.java create mode 100644 week02/q49_group_anagrams/Solution.java diff --git a/week02/q429_n_ary_tree_level_order_traversal/Node.java b/week02/q429_n_ary_tree_level_order_traversal/Node.java new file mode 100644 index 00000000..9dd39a26 --- /dev/null +++ b/week02/q429_n_ary_tree_level_order_traversal/Node.java @@ -0,0 +1,23 @@ +package q429_n_ary_tree_level_order_traversal; + +import java.util.List; + +/** + * @Description: + * @Author: liuchen created at 23:00 2020-10-28 + */ +class Node { + public int val; + public List children; + + public Node() {} + + public Node(int _val) { + val = _val; + } + + public Node(int _val, List _children) { + val = _val; + children = _children; + } +}; diff --git a/week02/q429_n_ary_tree_level_order_traversal/Solution.java b/week02/q429_n_ary_tree_level_order_traversal/Solution.java new file mode 100644 index 00000000..8a873627 --- /dev/null +++ b/week02/q429_n_ary_tree_level_order_traversal/Solution.java @@ -0,0 +1,60 @@ +package q429_n_ary_tree_level_order_traversal; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * N叉树的层序遍历 + *

+ * Solution: 从顶逐层遍历 + * Solution2: 迭代, 逐个将子遍历到端点 + *

+ * Time:O(n), Space:O(n) + * + * @Link: https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/ + * @Author: liuchen created at 23:00 2020-10-28 + */ +public class Solution { + + public List> levelOrder(Node root) { + if (root == null) { + return Collections.emptyList(); + } + List nodes = new ArrayList<>(); + nodes.add(root); + int i = 0; + List> lists = new ArrayList<>(); + while (i < nodes.size()) { + List list = new ArrayList<>(); + int len = nodes.size(); + for (; i < len; i++) { + Node node = nodes.get(i); + list.add(node.val); + if (node.children != null) { + nodes.addAll(node.children); + } + } + lists.add(list); + } + return lists; + } + + public static void main(String[] args) { + Node n5 = new Node(5); + Node n6 = new Node(6); + List n3Children = new ArrayList<>(2); + n3Children.add(n5); + n3Children.add(n6); + Node n3 = new Node(3, n3Children); + Node n2 = new Node(2); + Node n4 = new Node(4); + List n1Children = new ArrayList<>(3); + n1Children.add(n3); + n1Children.add(n2); + n1Children.add(n4); + Node n1 = new Node(1, n1Children); + Solution s = new Solution(); + System.out.println(s.levelOrder(n1)); + } +} diff --git a/week02/q429_n_ary_tree_level_order_traversal/Solution2.java b/week02/q429_n_ary_tree_level_order_traversal/Solution2.java new file mode 100644 index 00000000..8d4e86ce --- /dev/null +++ b/week02/q429_n_ary_tree_level_order_traversal/Solution2.java @@ -0,0 +1,49 @@ +package q429_n_ary_tree_level_order_traversal; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: liuchen created at 23:00 2020-10-28 + */ +public class Solution2 { + + private List> lists = new ArrayList<>(); + + public List> levelOrder(Node root) { + if (root != null) { + traverseNode(root, 0); + } + return lists; + } + + private void traverseNode(Node node, int level) { + if (lists.size() <= level) { + lists.add(new ArrayList<>()); + } + lists.get(level).add(node.val); + if (node.children != null) { + for (Node child : node.children) { + traverseNode(child, level + 1); + } + } + } + + public static void main(String[] args) { + Node n5 = new Node(5); + Node n6 = new Node(6); + List n3Children = new ArrayList<>(2); + n3Children.add(n5); + n3Children.add(n6); + Node n3 = new Node(3, n3Children); + Node n2 = new Node(2); + Node n4 = new Node(4); + List n1Children = new ArrayList<>(3); + n1Children.add(n3); + n1Children.add(n2); + n1Children.add(n4); + Node n1 = new Node(1, n1Children); + Solution2 s = new Solution2(); + System.out.println(s.levelOrder(n1)); + } +} diff --git a/week02/q49_group_anagrams/Solution.java b/week02/q49_group_anagrams/Solution.java new file mode 100644 index 00000000..7e00e26e --- /dev/null +++ b/week02/q49_group_anagrams/Solution.java @@ -0,0 +1,60 @@ +package q49_group_anagrams; + +import java.util.*; + +/** + * 字母异位词分组 + *

+ * Solution: + * 遍历strs, 将每个str先转换成字符统计值 + * 然后判断map 是否存在 + * 存在,找到List中对应List.add(str) + * 不存在, i++, 插入map + *

+ * Time: O(nk), Space: O(nk) + * + * @Link: https://leetcode-cn.com/problems/group-anagrams/ + * @Author: liuchen created at 16:29 2020-10-31 + */ +public class Solution { + + public List> groupAnagrams(String[] strs) { + if (strs.length < 1) { + return Collections.emptyList(); + } + HashMap map = new HashMap<>(strs.length); + List> lists = new ArrayList<>(strs.length); + int i = 0; + for (String s : strs) { + String ss = getStatisticStr(s); + if (map.containsKey(ss)) { + lists.get(map.get(ss)).add(s); + } else { + map.put(ss, i++); + List list = new ArrayList<>(); + list.add(s); + lists.add(list); + } + } + return lists; + } + + private String getStatisticStr(String str) { + HashMap map = new HashMap<>(26); + for (int i = 0; i < str.length(); i++) { + map.put(str.charAt(i), map.getOrDefault(str.charAt(i), 0) + 1); + } + StringBuffer sb = new StringBuffer(); + for (Map.Entry entry : map.entrySet()) { + sb.append(entry.getKey()); + sb.append(entry.getValue()); + } + return sb.toString(); + } + + public static void main(String[] args) { + String[] strs = new String[]{"eat", "tea", "tan", "ate", "nat", "bat"}; + Solution s = new Solution(); + System.out.println(s.groupAnagrams(strs)); + } +} From 73ce4dfc3910b66dce8d3b8439debee8e56df58d Mon Sep 17 00:00:00 2001 From: liuchen Date: Mon, 2 Nov 2020 10:09:53 +0800 Subject: [PATCH 12/29] up for week2 --- week02/q49_chou_shu_lcof/Solution.java | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 week02/q49_chou_shu_lcof/Solution.java diff --git a/week02/q49_chou_shu_lcof/Solution.java b/week02/q49_chou_shu_lcof/Solution.java new file mode 100644 index 00000000..e2858a7e --- /dev/null +++ b/week02/q49_chou_shu_lcof/Solution.java @@ -0,0 +1,33 @@ +package q49_chou_shu_lcof; + +/** + * 丑数 + *

+ * Solution: 动态规划,n=min(i*2, j*3, k*5), 由次结合第一位是1,逐个往下生成到第n位 + *

+ * Time: O(n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/chou-shu-lcof/ + * @Author: liuchen created at 19:39 2020-11-01 + */ +public class Solution { + public int nthUglyNumber(int n) { + int a = 0, b = 0, c = 0; + int[] dp = new int[n]; + dp[0] = 1; + for (int i = 1; i < n; i++) { + int n2 = dp[a] * 2, n3 = dp[b] * 3, n5 = dp[c] * 5; + dp[i] = Math.min(Math.min(n2, n3), n5); + if(dp[i] == n2) a++; + if(dp[i] == n3) b++; + if(dp[i] == n5) c++; + } + return dp[n-1]; + } + + public static void main(String[] args) { + int n = 10; + Solution s = new Solution(); + System.out.println(s.nthUglyNumber(n)); + } +} From c06f8c30e439a74988b437171b4a098de634370a Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 7 Nov 2020 15:54:16 +0800 Subject: [PATCH 13/29] up for week3 --- week03/NOTE.md | 13 +++- .../Solution.java | 60 +++++++++++++++++++ .../TreeNode.java | 15 +++++ .../Solution.java | 54 +++++++++++++++++ .../TreeNode.java | 12 ++++ 5 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 week03/q105_construct_binary_tree_from_preorder_and_inorder_traversal/Solution.java create mode 100644 week03/q105_construct_binary_tree_from_preorder_and_inorder_traversal/TreeNode.java create mode 100644 week03/q236_lowest_common_ancestor_of_a_binary_tree/Solution.java create mode 100644 week03/q236_lowest_common_ancestor_of_a_binary_tree/TreeNode.java diff --git a/week03/NOTE.md b/week03/NOTE.md index 50de3041..507a34e0 100644 --- a/week03/NOTE.md +++ b/week03/NOTE.md @@ -1 +1,12 @@ -学习笔记 \ No newline at end of file +# 递归 Recursion +* 模版 + * 递归终结条件 + * 处理当前层逻辑 + * 下探到下一层 + * 清理当前层 + +* 分治 + * 分解问题 + * 找重复性 + +* 回溯 \ No newline at end of file diff --git a/week03/q105_construct_binary_tree_from_preorder_and_inorder_traversal/Solution.java b/week03/q105_construct_binary_tree_from_preorder_and_inorder_traversal/Solution.java new file mode 100644 index 00000000..f27dbf71 --- /dev/null +++ b/week03/q105_construct_binary_tree_from_preorder_and_inorder_traversal/Solution.java @@ -0,0 +1,60 @@ +package q105_construct_binary_tree_from_preorder_and_inorder_traversal; + +import java.util.HashMap; +import java.util.Map; + +/** + * 从前序与中序遍历序列构造二叉树 + *

+ * Solution:将问题分解为,递归生成左右子树,根据 + * 1. 前序遍历第一个为根节点 + * 2. 找到中序遍历中的根节点key为i,其左侧为其左子树所有节点,右侧为其右子树所有节点 + * 3. 获得左子树所有节点长度left_len + * 3. 生成左子树,preorder[0+1..0+left_len], inorder[0..i-1] + * 4. 生成右子树, preorder[0+left_len+1..preorder.len-1], inorder[i+1..inorder.len-1] + *

+ * Time: O(n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ + * @Author: liuchen created at 09:52 2020-11-07 + */ +public class Solution { + + private Map indexMap; + + public TreeNode buildTree(int[] preorder, int[] inorder) { + int n = preorder.length; + indexMap = new HashMap<>(); + for (int i = 0; i < n; i++) { + indexMap.put(inorder[i], i); + } + return helper(preorder, inorder, 0, n - 1, 0, n - 1); + } + + private TreeNode helper(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) { + // 终止条件 + if (preorder_left > preorder_right) { + return null; + } + // 首先可以确定,前序遍历(根左右)的第一个节点,就是根节点 + int preorder_root = preorder_left; + // 建立根节点 + TreeNode root = new TreeNode(preorder[preorder_root]); + // 然后在中序遍历(左根右)中,确定根节点位置n, 由此可以确定inorder中[0..n-1]为左子树所有节点,[n+1..inorder.len-1]为右子树所有节点 + int inorder_root = indexMap.get(preorder[preorder_root]); + // 计算左子树节点数 + int size_left_subtree = inorder_root - inorder_left; + // 递归生成左子树 + root.left = helper(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1); + // 递归生成右子树 + root.right = helper(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right); + return root; + } + + public static void main(String[] args) { + int[] preorder = new int[]{3, 9, 20, 15, 7}; + int[] inorder = new int[]{9, 3, 15, 20, 7}; + Solution s = new Solution(); + System.out.println(s.buildTree(preorder, inorder)); + } +} \ No newline at end of file diff --git a/week03/q105_construct_binary_tree_from_preorder_and_inorder_traversal/TreeNode.java b/week03/q105_construct_binary_tree_from_preorder_and_inorder_traversal/TreeNode.java new file mode 100644 index 00000000..1f198d12 --- /dev/null +++ b/week03/q105_construct_binary_tree_from_preorder_and_inorder_traversal/TreeNode.java @@ -0,0 +1,15 @@ +package q105_construct_binary_tree_from_preorder_and_inorder_traversal; + +/** + * @Description: + * @Author: liuchen created at 09:52 2020-11-07 + */ +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + this.val = x; + } +} diff --git a/week03/q236_lowest_common_ancestor_of_a_binary_tree/Solution.java b/week03/q236_lowest_common_ancestor_of_a_binary_tree/Solution.java new file mode 100644 index 00000000..aa69b3c7 --- /dev/null +++ b/week03/q236_lowest_common_ancestor_of_a_binary_tree/Solution.java @@ -0,0 +1,54 @@ +package q236_lowest_common_ancestor_of_a_binary_tree; + +/** + * 二叉树的最近公共祖先 + *

+ * Solution: 将问题分解为,左右子是否含p/q,当某节点的左右分别含p/q时,级p/q最近公共祖先 + *

+ * Time: O(n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/ + * @Author: liuchen created at 23:44 2020-11-04 + */ +public class Solution { + + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + if (root == null || root == p || root == q) { + return root; + } + TreeNode left = lowestCommonAncestor(root.left, p, q); + TreeNode right = lowestCommonAncestor(root.right, p, q); + if (left == null && right == null) { + return null; + } + if (left == null) { + return right; + } + if (right == null) { + return left; + } + return root; + } + + public static void main(String[] args) { + TreeNode n4 = new TreeNode(4); + TreeNode n7 = new TreeNode(7); + TreeNode n8 = new TreeNode(8); + TreeNode n0 = new TreeNode(0); + TreeNode n6 = new TreeNode(6); + TreeNode n2 = new TreeNode(2); + n2.left = n7; + n2.right = n4; + TreeNode n5 = new TreeNode(5); + n5.left = n6; + n5.right = n2; + TreeNode n1 = new TreeNode(1); + n1.left = n0; + n1.right = n8; + TreeNode n3 = new TreeNode(3); + n3.left = n5; + n3.right = n1; + Solution s = new Solution(); + System.out.println(s.lowestCommonAncestor(n3, n5, n1)); + } +} diff --git a/week03/q236_lowest_common_ancestor_of_a_binary_tree/TreeNode.java b/week03/q236_lowest_common_ancestor_of_a_binary_tree/TreeNode.java new file mode 100644 index 00000000..9359f45e --- /dev/null +++ b/week03/q236_lowest_common_ancestor_of_a_binary_tree/TreeNode.java @@ -0,0 +1,12 @@ +package q236_lowest_common_ancestor_of_a_binary_tree; + +/** + * @Description: + * @Author: liuchen created at 23:44 2020-11-04 + */ +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + TreeNode(int x) { val = x; } +} From 9915afdac89c9d375f2a9566ad1e288d60fe832f Mon Sep 17 00:00:00 2001 From: liuchen Date: Sun, 8 Nov 2020 09:34:55 +0800 Subject: [PATCH 14/29] up for week3 --- week03/q46_permutations/Solution.java | 59 +++++++++++++++++++++++++++ week03/q77_combinations/Solution.java | 52 +++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 week03/q46_permutations/Solution.java create mode 100644 week03/q77_combinations/Solution.java diff --git a/week03/q46_permutations/Solution.java b/week03/q46_permutations/Solution.java new file mode 100644 index 00000000..531bfc74 --- /dev/null +++ b/week03/q46_permutations/Solution.java @@ -0,0 +1,59 @@ +package q46_permutations; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 全排列 + *

+ * Solution: + *

+ * Time:O(n*n!),Space:O(n!) + * + * @Link: https://leetcode-cn.com/problems/permutations/ + * @Author: liuchen created at 08:07 8/11/2020 + */ +public class Solution { + + private List> lists; + private List path; + private boolean[] used; + + public List> permute(int[] nums) { + if (nums.length < 1) { + return lists; + } + lists = new ArrayList<>(); + path = new ArrayList<>(); + used = new boolean[nums.length]; + dfs(nums, 0); + return lists; + } + + private void dfs(int[] nums, int depth) { + if (depth == nums.length) { + lists.add(new ArrayList<>(path)); + return; + } + for (int i = 0; i < nums.length; i++) { + if (!used[i]) { + path.add(nums[i]); + used[i] = true; + System.out.println("before: " + path); + dfs(nums, depth + 1); + System.out.println("after: " + path); + used[i] = false; + path.remove(path.size() - 1); + } + } + } + + public static void main(String[] args) { + int[] nums = new int[]{1, 2, 3}; + Solution s = new Solution(); + for (List list : s.permute(nums)) { + System.out.println(Arrays.toString(list.toArray())); + } + } +} diff --git a/week03/q77_combinations/Solution.java b/week03/q77_combinations/Solution.java new file mode 100644 index 00000000..3a76cb57 --- /dev/null +++ b/week03/q77_combinations/Solution.java @@ -0,0 +1,52 @@ +package q77_combinations; + +import java.util.*; + +/** + * 组合 + *

+ * Solution: + *

+ * Time:O(n^k), Space:O(n) + * + * @Link: https://leetcode-cn.com/problems/combinations/ + * @Author: liuchen created at 23:13 7/11/2020 + */ +public class Solution { + private List> lists; + private Deque path; + + public List> combine(int n, int k) { + lists = new ArrayList<>(); + if (k <= 0 || n < k) { + return lists; + } + path = new ArrayDeque<>(); + dfs(n, k, 1); + return lists; + } + + private void dfs(int n, int k, int begin) { + // 终止条件:path长度等于k + if (path.size() == k) { + lists.add(new ArrayList<>(path)); + return; + } + for (int i = begin; i <= n; i++) { + path.addLast(i); + System.out.println("before :" + path); + dfs(n, k, i + 1); + System.out.println("after :" + path); + path.removeLast(); + } + } + + public static void main(String[] args) { + int n = 5; + int k = 3; + Solution s = new Solution(); + for (List list : s.combine(n, k)) { + System.out.println(Arrays.toString(list.toArray())); + } + } +} From 84e846e346c77fca3cdf3a21bdba352b1fb3a2bc Mon Sep 17 00:00:00 2001 From: liuchen Date: Tue, 10 Nov 2020 07:20:51 +0800 Subject: [PATCH 15/29] up for week4 --- week04/NOTE.md | 54 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/week04/NOTE.md b/week04/NOTE.md index 50de3041..781db09d 100644 --- a/week04/NOTE.md +++ b/week04/NOTE.md @@ -1 +1,53 @@ -学习笔记 \ No newline at end of file +# 搜索-遍历 +* 每个节点都要访问一次 +* 每个节点仅访问一次 +* 顺序不同 + * 深度优先:dfs (depth first search) + * 广度优先: bfs (breadth first search) + * 优先级优先 + +* DFS模版 + * 二叉 + ``` + def dfs(node): + if node in visited: + return + visited.add(node) + # logic code here + dfs(node.left) + dfs(node.right) + ``` + * 多叉 + ``` + # 递归 + def dfs(node, visited): + if node in visited: + return + visited.add(node) + # logic code here + for next_node in node.children(): + if not next_node in visited: + dfs(next_node, visited) + # 非递归 + dfs (self, tree): + if tree.root is None: + return + visited, stack = [], [tree.root] + while stack: + node = stack.pop() + visited.add(node) + # logic code here + stack.push(node.children) + ``` +* BFS模版 + ``` + def bfs(graph, start, end): + queue = [] + queue.append([start]) + visited.add(start) + while queue: + node = queue.popleft() + visited.add(node) + # logic code here + queue.push(node.children) + ``` \ No newline at end of file From d77ce868eeff815cbca794a6ad5b063d090c8f3b Mon Sep 17 00:00:00 2001 From: liuchen Date: Wed, 11 Nov 2020 22:56:17 +0800 Subject: [PATCH 16/29] up --- week04/NOTE.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/week04/NOTE.md b/week04/NOTE.md index 781db09d..4c55a334 100644 --- a/week04/NOTE.md +++ b/week04/NOTE.md @@ -41,7 +41,7 @@ ``` * BFS模版 ``` - def bfs(graph, start, end): + def bfs(graph, start, end): queue = [] queue.append([start]) visited.add(start) @@ -50,4 +50,9 @@ visited.add(node) # logic code here queue.push(node.children) - ``` \ No newline at end of file + ``` + +# 贪心算法 Greedy + * 贪心:当前左局部最优 + * 回溯:能够回退 + * 动态规划:最优判断 + 回退 \ No newline at end of file From 7816733a79f88cdae815c2bab64548af387dd59b Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 14 Nov 2020 14:49:30 +0800 Subject: [PATCH 17/29] up for week4 --- week04/NOTE.md | 32 ++++++++++-- .../Solution.java | 32 ++++++++++++ week04/q455_assign_cookies/Solution.java | 46 +++++++++++++++++ week04/q455_assign_cookies/Solution2.java | 41 +++++++++++++++ week04/q860_lemonade_change/Solution.java | 50 +++++++++++++++++++ 5 files changed, 198 insertions(+), 3 deletions(-) create mode 100644 week04/q122_best_time_to_buy_and_sell_stock_ii/Solution.java create mode 100644 week04/q455_assign_cookies/Solution.java create mode 100644 week04/q455_assign_cookies/Solution2.java create mode 100644 week04/q860_lemonade_change/Solution.java diff --git a/week04/NOTE.md b/week04/NOTE.md index 4c55a334..24712334 100644 --- a/week04/NOTE.md +++ b/week04/NOTE.md @@ -53,6 +53,32 @@ ``` # 贪心算法 Greedy - * 贪心:当前左局部最优 - * 回溯:能够回退 - * 动态规划:最优判断 + 回退 \ No newline at end of file +* 贪心:当前左局部最优 +* 回溯:能够回退 +* 动态规划:最优判断 + 回退 + +# 二分查找 +* O(logN) +* 目标函数单调性(单调递增或递减) +* 存在上下界 +* 能 通过索引访问 +* 代码模版 +``` +left, right = 0, len(array) - 1 +while left <= right + mid = (left + right) / 2 + if array[mid] == target + return result + else if array[mid] < target + left = mid + 1 + else + right = mid - 1 +``` +# 牛顿迭代法 +``` +def mySqrt(x) + r = x + while r*r > x + r = (r + x/r) / 2 + return r +``` \ No newline at end of file diff --git a/week04/q122_best_time_to_buy_and_sell_stock_ii/Solution.java b/week04/q122_best_time_to_buy_and_sell_stock_ii/Solution.java new file mode 100644 index 00000000..ed30825c --- /dev/null +++ b/week04/q122_best_time_to_buy_and_sell_stock_ii/Solution.java @@ -0,0 +1,32 @@ +package q122_best_time_to_buy_and_sell_stock_ii; + +/** + * 买卖股票的最佳时机 II + *

+ * Solution:<贪心算法>只要判断比前一天大,就计算为收益 + *

+ * Time:O(n), Space: O(1) + * + * @Link: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/description/ + * @Author: liuchen created at 10:50 14/11/2020 + */ +public class Solution { + public int maxProfit(int[] prices) { + if (prices.length <= 0) { + return 0; + } + int money = 0; + for (int i = 1; i < prices.length; i++) { + if (prices[i] > prices[i - 1]) { + money += prices[i] - prices[i - 1]; + } + } + return money; + } + + public static void main(String[] args) { + int[] prices = new int[]{1, 2, 3, 4, 5}; + Solution s = new Solution(); + System.out.println(s.maxProfit(prices)); + } +} diff --git a/week04/q455_assign_cookies/Solution.java b/week04/q455_assign_cookies/Solution.java new file mode 100644 index 00000000..36ff458c --- /dev/null +++ b/week04/q455_assign_cookies/Solution.java @@ -0,0 +1,46 @@ +package q455_assign_cookies; + +import java.util.HashMap; +import java.util.TreeSet; + +/** + * 分发饼干 + *

+ * Solution: + *

+ * Time:, Space: + * + * @Link: https://leetcode-cn.com/problems/assign-cookies/description/ + * @Author: liuchen created at 11:03 14/11/2020 + */ +public class Solution { + public int findContentChildren(int[] g, int[] s) { + if (g.length <= 0 || s.length <= 0) { + return 0; + } + HashMap map = new HashMap<>(s.length); + TreeSet set = new TreeSet(); + for (int i : s) { + map.put(i, map.getOrDefault(i, 0) + 1); + set.add(i); + } + int n = 0; + for (int i : g) { + for (Integer j : set) { + if (j >= i && map.get(j) > 0) { + map.put(j, map.get(j) - 1); + ++n; + break; + } + } + } + return n; + } + + public static void main(String[] args) { + int[] g = new int[]{1, 2}; + int[] s = new int[]{1, 2, 3}; + Solution solution = new Solution(); + System.out.println(solution.findContentChildren(g, s)); + } +} diff --git a/week04/q455_assign_cookies/Solution2.java b/week04/q455_assign_cookies/Solution2.java new file mode 100644 index 00000000..9e5f267d --- /dev/null +++ b/week04/q455_assign_cookies/Solution2.java @@ -0,0 +1,41 @@ +package q455_assign_cookies; + +import java.util.Arrays; + +/** + * 分发饼干 + *

+ * Solution: <贪心算法>先分别对G,S排序,然后双指针思路往下走,满足S[j]>=G[i]时计数器+1 + *

+ * Time: O(n), Space: O(1) + * + * @Link: https://leetcode-cn.com/problems/assign-cookies/description/ + * @Author: liuchen created at 11:03 14/11/2020 + */ +public class Solution2 { + public int findContentChildren(int[] g, int[] s) { + if (g.length <= 0 || s.length <= 0) { + return 0; + } + Arrays.sort(g); + Arrays.sort(s); + int result = 0; + int i = 0; + int j = 0; + while (i != g.length && j != s.length) { + if (s[j] >= g[i]) { + ++result; + ++i; + } + ++j; + } + return result; + } + + public static void main(String[] args) { + int[] g = new int[]{1, 2}; + int[] s = new int[]{1, 2, 3}; + Solution2 solution = new Solution2(); + System.out.println(solution.findContentChildren(g, s)); + } +} diff --git a/week04/q860_lemonade_change/Solution.java b/week04/q860_lemonade_change/Solution.java new file mode 100644 index 00000000..a530bca4 --- /dev/null +++ b/week04/q860_lemonade_change/Solution.java @@ -0,0 +1,50 @@ +package q860_lemonade_change; + +/** + * 柠檬水找零 + *

+ * Solution: 10找零需要5,20找零需要5+10或5+5+5,所以做5和10计数器,收钱时判断是否满足,以及变更计数器 + *

+ * Time: O(n), Space: O(1) + * + * @Link: https://leetcode-cn.com/problems/lemonade-change/description/ + * @Author: liuchen created at 10:21 14/11/2020 + */ +public class Solution { + + public boolean lemonadeChange(int[] bills) { + int fiveNum = 0; + int tenNum = 0; + if (bills.length <= 0) { + return true; + } + for (int i = 0; i < bills.length; i++) { + if (bills[i] == 5) { + fiveNum++; + } else if (bills[i] == 10) { + if (fiveNum > 0) { + fiveNum--; + tenNum++; + } else { + return false; + } + } else if (bills[i] == 20) { + if (fiveNum > 0 && tenNum > 0) { + tenNum--; + fiveNum--; + } else if (fiveNum >= 3) { + fiveNum -= 3; + } else { + return false; + } + } + } + return true; + } + + public static void main(String[] args) { + int[] bills = new int[]{5, 5, 10, 10, 20}; + Solution s = new Solution(); + System.out.println(s.lemonadeChange(bills)); + } +} From 5f41e6594e2332c30f97e1e8bd560489f3aa5e87 Mon Sep 17 00:00:00 2001 From: liuchen Date: Fri, 27 Nov 2020 18:46:59 +0800 Subject: [PATCH 18/29] up --- week06/q120_triangle/Solution.java | 71 ++++++++++++++++++++++ week06/q53_maximum_subarray/Solution.java | 33 ++++++++++ week06/q53_maximum_subarray/Solution2.java | 27 ++++++++ week06/q53_maximum_subarray/Solution3.java | 31 ++++++++++ week06/q70_climbing_stairs/Solution.java | 37 +++++++++++ week06/q70_climbing_stairs/Solution2.java | 28 +++++++++ week06/q70_climbing_stairs/Solution3.java | 24 ++++++++ week06/q70_climbing_stairs/Solution4.java | 31 ++++++++++ week06/q70_climbing_stairs/Solution5.java | 37 +++++++++++ 9 files changed, 319 insertions(+) create mode 100644 week06/q120_triangle/Solution.java create mode 100644 week06/q53_maximum_subarray/Solution.java create mode 100644 week06/q53_maximum_subarray/Solution2.java create mode 100644 week06/q53_maximum_subarray/Solution3.java create mode 100644 week06/q70_climbing_stairs/Solution.java create mode 100644 week06/q70_climbing_stairs/Solution2.java create mode 100644 week06/q70_climbing_stairs/Solution3.java create mode 100644 week06/q70_climbing_stairs/Solution4.java create mode 100644 week06/q70_climbing_stairs/Solution5.java diff --git a/week06/q120_triangle/Solution.java b/week06/q120_triangle/Solution.java new file mode 100644 index 00000000..e356b22e --- /dev/null +++ b/week06/q120_triangle/Solution.java @@ -0,0 +1,71 @@ +package q120_triangle; + +import java.util.ArrayList; +import java.util.List; + +/** + * 三角形最小路径和 + *

+ * Solution: 动态规划,f(i,j) = min(f(i-1,j-1), f(i-1,j)) + f(i,j) + *

+ * Time:O(n), Space:O(n) + * + * @Link: https://leetcode-cn.com/problems/triangle/description/ + * @Author: liuchen created at 16:43 27/11/2020 + */ +public class Solution { + + public int minimumTotal(List> triangle) { + if (triangle.size() <= 0 || triangle.get(0).size() <= 0) { + return 0; + } + int[][] dp = new int[triangle.size()][triangle.get(triangle.size() - 1).size()]; + dp[0][0] = triangle.get(0).get(0); + if (triangle.size() == 1) { + return dp[0][0]; + } + int min = Integer.MAX_VALUE; + for (int i = 1; i < triangle.size(); i++) { + for (int j = 0; j < triangle.get(i).size(); j++) { + if (j == 0) { + // 本行第一位 + dp[i][j] = dp[i - 1][j] + triangle.get(i).get(j); + } else if (j == triangle.get(i).size() - 1) { + // 本行最后一位 + dp[i][j] = dp[i - 1][j - 1] + triangle.get(i).get(j); + } else { + dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle.get(i).get(j); + } + // 最后一行,与min进行比较 + if (i == triangle.size() - 1) { + min = Math.min(min, dp[i][j]); + } + } + } + return min; + } + + public static void main(String[] args) { + List> triangle = new ArrayList<>(); + List line1 = new ArrayList<>(); + line1.add(2); + List line2 = new ArrayList<>(); + line2.add(3); + line2.add(4); + List line3 = new ArrayList<>(); + line3.add(6); + line3.add(5); + line3.add(7); + List line4 = new ArrayList<>(); + line4.add(4); + line4.add(1); + line4.add(8); + line4.add(3); + triangle.add(line1); + triangle.add(line2); + triangle.add(line3); + triangle.add(line4); + Solution s = new Solution(); + System.out.println(s.minimumTotal(triangle)); + } +} diff --git a/week06/q53_maximum_subarray/Solution.java b/week06/q53_maximum_subarray/Solution.java new file mode 100644 index 00000000..21e7a170 --- /dev/null +++ b/week06/q53_maximum_subarray/Solution.java @@ -0,0 +1,33 @@ +package q53_maximum_subarray; + +/** + * 最大子序和 + * + * @Link: https://leetcode-cn.com/problems/maximum-subarray/ + * @Author: liuchen created at 13:40 19/11/2020 + */ +public class Solution { + + public int maxSubArray(int[] nums) { + if (nums == null || nums.length == 0) { + return 0; + } + int ans = nums[0]; + int sum = 0; + for (int num : nums) { + if (sum > 0) { + sum += num; + } else { + sum = num; + } + ans = Math.max(sum, ans); + } + return ans; + } + + public static void main(String[] args) { + int[] nums = new int[]{-2, 1, -3, 4, -1, 2, 1, -5, 4}; + Solution s = new Solution(); + System.out.println(s.maxSubArray(nums)); + } +} diff --git a/week06/q53_maximum_subarray/Solution2.java b/week06/q53_maximum_subarray/Solution2.java new file mode 100644 index 00000000..7064964e --- /dev/null +++ b/week06/q53_maximum_subarray/Solution2.java @@ -0,0 +1,27 @@ +package q53_maximum_subarray; + +/** + * 最大子序和 + * + * @Link: https://leetcode-cn.com/problems/maximum-subarray/ + * @Author: liuchen created at 13:40 19/11/2020 + */ +public class Solution2 { + + public int maxSubArray(int[] nums) { + int[] dp = new int[nums.length]; + dp[0] = nums[0]; + int max = dp[0]; + for (int i = 1; i < nums.length; i++) { + dp[i] = nums[i] + Math.max(dp[i - 1], 0); + max = Math.max(max, dp[i]); + } + return max; + } + + public static void main(String[] args) { + int[] nums = new int[]{-2, 1, -3, 4, -1, 2, 1, -5, 4}; + Solution2 s = new Solution2(); + System.out.println(s.maxSubArray(nums)); + } +} diff --git a/week06/q53_maximum_subarray/Solution3.java b/week06/q53_maximum_subarray/Solution3.java new file mode 100644 index 00000000..90445a6e --- /dev/null +++ b/week06/q53_maximum_subarray/Solution3.java @@ -0,0 +1,31 @@ +package q53_maximum_subarray; + +/** + * 最大子序和 + * + * @Link: https://leetcode-cn.com/problems/maximum-subarray/ + * @Author: liuchen created at 13:40 19/11/2020 + */ +public class Solution3 { + + public int maxSubArray(int[] nums) { + int[] dp = new int[nums.length]; + int max = Integer.MIN_VALUE; + for (int i = 0; i < nums.length; i++) { + if (i == 0) { + dp[i] = nums[i]; + max = dp[i]; + continue; + } + dp[i] = Math.max(dp[i - 1], 0) + nums[i]; + max = Math.max(max, dp[i]); + } + return max; + } + + public static void main(String[] args) { + int[] nums = new int[]{-2, 1, -3, 4, -1, 2, 1, -5, 4}; + Solution3 s = new Solution3(); + System.out.println(s.maxSubArray(nums)); + } +} diff --git a/week06/q70_climbing_stairs/Solution.java b/week06/q70_climbing_stairs/Solution.java new file mode 100644 index 00000000..937722a3 --- /dev/null +++ b/week06/q70_climbing_stairs/Solution.java @@ -0,0 +1,37 @@ +package q70_climbing_stairs; + +import java.util.HashMap; + +/** + * 爬楼梯 + * + * Solution: 核心点,第n阶的方法表达式 f(n) = f(n-1) + f(n-2) + * + * Solution1: 动态规划, Time: O(n), Space: O(1) + * Solution2: 递归, Time: O(2^n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/climbing-stairs/ + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution { + + HashMap map = new HashMap<>(); + + public int climbStairs(int n) { + if (this.map.containsKey(n)) { + return this.map.get(n); + } + if (n < 3) { + return n; + } + int m = climbStairs(n - 1) + climbStairs(n - 2); + this.map.put(n, m); + return m; + } + + public static void main(String[] args) { + int n = 3; + Solution s = new Solution(); + System.out.println(s.climbStairs(n)); + } +} diff --git a/week06/q70_climbing_stairs/Solution2.java b/week06/q70_climbing_stairs/Solution2.java new file mode 100644 index 00000000..f39117be --- /dev/null +++ b/week06/q70_climbing_stairs/Solution2.java @@ -0,0 +1,28 @@ +package q70_climbing_stairs; + +/** + * @Description: + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution2 { + + public int climbStairs(int n) { + if (n < 3) { + return n; + } + int preTwo = 1; + int preOne = 2; + for (int i = 3; i < n; i++) { + int tmp = preOne; + preOne = preOne + preTwo; + preTwo = tmp; + } + return preOne + preTwo; + } + + public static void main(String[] args) { + int n = 4; + Solution2 s = new Solution2(); + System.out.println(s.climbStairs(n)); + } +} diff --git a/week06/q70_climbing_stairs/Solution3.java b/week06/q70_climbing_stairs/Solution3.java new file mode 100644 index 00000000..42298f72 --- /dev/null +++ b/week06/q70_climbing_stairs/Solution3.java @@ -0,0 +1,24 @@ +package q70_climbing_stairs; + +/** + * @Description: + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution3 { + + public int climbStairs(int n) { + if (n == 1) { + return 1; + } + if (n == 2) { + return 2; + } + return climbStairs(n - 1) + climbStairs(n - 2); + } + + public static void main(String[] args) { + int n = 3; + Solution3 s = new Solution3(); + System.out.println(s.climbStairs(n)); + } +} diff --git a/week06/q70_climbing_stairs/Solution4.java b/week06/q70_climbing_stairs/Solution4.java new file mode 100644 index 00000000..bbbafa31 --- /dev/null +++ b/week06/q70_climbing_stairs/Solution4.java @@ -0,0 +1,31 @@ +package q70_climbing_stairs; + +/** + * @Description: + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution4 { + + public int climbStairs(int n) { + if (n == 1) { + return 1; + } + if (n == 2) { + return 2; + } + int preTwo = 1; + int preOne = 2; + for(int i = 3; i + * Solution:动态规划 dp[n] = dp[n-1] + dp[n-2] + *

+ * Time:O(n),Space:O(1) + * + * @Link: https://leetcode-cn.com/problems/climbing-stairs/description/ + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution5 { + + public int climbStairs(int n) { + if (n < 1) { + return 0; + } + if (n < 3) { + return n; + } + int preOne = 2; + int preTwo = 1; + for (int i = 3; i < n; i++) { + int tmp = preOne; + preOne += preTwo; + preTwo = tmp; + } + return preOne + preTwo; + } + + public static void main(String[] args) { + int n = 4; + Solution5 s = new Solution5(); + System.out.println(s.climbStairs(n)); + } +} From 0be32ae5c4a607c6aedb9e18b0f189b0270bab88 Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 28 Nov 2020 09:51:30 +0800 Subject: [PATCH 19/29] up --- week06/q62_unique_paths/Solution.java | 42 ++++++++++++++++++++++++++ week06/q62_unique_paths/Solution2.java | 34 +++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 week06/q62_unique_paths/Solution.java create mode 100644 week06/q62_unique_paths/Solution2.java diff --git a/week06/q62_unique_paths/Solution.java b/week06/q62_unique_paths/Solution.java new file mode 100644 index 00000000..47ea497a --- /dev/null +++ b/week06/q62_unique_paths/Solution.java @@ -0,0 +1,42 @@ +package q62_unique_paths; + +/** + * 不同路径 + *

+ * Solution1:动态规划, f(i,j) = f(i,j-1) + f(i-1,j) + * Solution2:Solution1基础上,空间O(n),仅保存上一行信息 + *

+ * Time:O(mn),Space:O(mn)/O(n) + * + * @Link: https://leetcode-cn.com/problems/unique-paths/ + * @Author: liuchen created at 20:29 25/11/2020 + */ +public class Solution { + + public int uniquePaths(int m, int n) { + int[][] dp = new int[m][n]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (i == 0 && j == 0) { + dp[i][j] = 1; + continue; + } + if (j == 0) { + dp[i][j] = dp[i - 1][j]; + } else if (i == 0) { + dp[i][j] = dp[i][j - 1]; + } else { + dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + } + } + } + return dp[m - 1][n - 1]; + } + + public static void main(String[] args) { + int m = 3; + int n = 2; + Solution s = new Solution(); + System.out.println(s.uniquePaths(m, n)); + } +} diff --git a/week06/q62_unique_paths/Solution2.java b/week06/q62_unique_paths/Solution2.java new file mode 100644 index 00000000..149c29fa --- /dev/null +++ b/week06/q62_unique_paths/Solution2.java @@ -0,0 +1,34 @@ +package q62_unique_paths; + +import java.util.Arrays; + +/** + * 不同路径 + *

+ * Solution:动态规划, f(i,j) = f(i,j-1) + f(i-1,j) + *

+ * Time:O(n),Space:O(n) + * + * @Link: https://leetcode-cn.com/problems/unique-paths/ + * @Author: liuchen created at 20:29 25/11/2020 + */ +public class Solution2 { + + public int uniquePaths(int m, int n) { + int[] line = new int[n]; + Arrays.fill(line, 1); + for (int i = 1; i < m; i++) { + for (int j = 1; j < n; j++) { + line[j] += line[j - 1];// 等于 f(i,j) = f(i-1,j) + f(i, j-1) + } + } + return line[n - 1]; + } + + public static void main(String[] args) { + int m = 3; + int n = 2; + Solution2 s = new Solution2(); + System.out.println(s.uniquePaths(m, n)); + } +} From 7525a879a7f772c75d8c4059cfe3a2310c0755bc Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 28 Nov 2020 10:35:58 +0800 Subject: [PATCH 20/29] up --- week06/q63_unique_paths_ii/Solution.java | 50 +++++++++++++++++++++++ week06/q63_unique_paths_ii/Solution2.java | 43 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 week06/q63_unique_paths_ii/Solution.java create mode 100644 week06/q63_unique_paths_ii/Solution2.java diff --git a/week06/q63_unique_paths_ii/Solution.java b/week06/q63_unique_paths_ii/Solution.java new file mode 100644 index 00000000..1d22aa1b --- /dev/null +++ b/week06/q63_unique_paths_ii/Solution.java @@ -0,0 +1,50 @@ +package q63_unique_paths_ii; + +/** + * 不同路径 II + *

+ * Solution: 动态规划,类似q62,f(i,j) = f(i-1,j) + f(i,j-1),基础上 每次i,j坐标过滤下是否障碍物,是则f(i,j)=0 + * Solution2: Solution1基础上,空间O(n),仅保存上一行信息 + *

+ * Time:O(mn), Space:O(mn)/O(n) + * + * @Link: https://leetcode-cn.com/problems/unique-paths-ii/ + * @Author: liuchen created at 09:29 28/11/2020 + */ +public class Solution { + public int uniquePathsWithObstacles(int[][] obstacleGrid) { + if (obstacleGrid.length < 1 || obstacleGrid[0].length < 1) { + return 0; + } + int m = obstacleGrid.length; + int n = obstacleGrid[0].length; + int[][] dp = new int[m][n]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (obstacleGrid[i][j] == 1) { + dp[i][j] = 0; + continue; + } + if (i == 0 && j == 0) { + dp[i][j] = 1; + continue; + } + if (i == 0) { + dp[i][j] = dp[i][j - 1]; + } else if (j == 0) { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = dp[i][j - 1] + dp[i - 1][j]; + } + } + } + return dp[m - 1][n - 1]; + } + + public static void main(String[] args) { + int[][] obstacleGrid = {{0, 0, 0}, {0, 1, 0}, {0, 0, 0}}; +// int[][] obstacleGrid = {{0, 1}, {0, 0}}; + Solution s = new Solution(); + System.out.println(s.uniquePathsWithObstacles(obstacleGrid)); + } +} \ No newline at end of file diff --git a/week06/q63_unique_paths_ii/Solution2.java b/week06/q63_unique_paths_ii/Solution2.java new file mode 100644 index 00000000..08df1133 --- /dev/null +++ b/week06/q63_unique_paths_ii/Solution2.java @@ -0,0 +1,43 @@ +package q63_unique_paths_ii; + +/** + * 不同路径 II + *

+ * Solution: 动态规划,类似q62,f(i,j) = f(i-1,j) + f(i,j-1),基础上 每次i,j坐标过滤下是否障碍物,是则f(i,j)=0 + *

+ * Time:O(mn), Space:O(mn)/O(n) + * + * @Link: https://leetcode-cn.com/problems/unique-paths-ii/ + * @Author: liuchen created at 09:29 28/11/2020 + */ +public class Solution2 { + public int uniquePathsWithObstacles(int[][] obstacleGrid) { + int m = obstacleGrid.length; + int n = obstacleGrid[0].length; + int[] line = new int[n]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { +// System.out.println(i+","+j); + if (obstacleGrid[i][j] == 1) { + line[j] = 0; + continue; + } + if (i == 0 && j == 0) { + line[j] = 1; + continue; + } + if (j > 0) { + line[j] += line[j - 1]; + } + } + } + return line[n - 1]; + } + + public static void main(String[] args) { + int[][] obstacleGrid = {{0, 0, 0}, {0, 1, 0}, {0, 0, 0}}; +// int[][] obstacleGrid = {{0, 1}, {0, 0}}; + Solution2 s = new Solution2(); + System.out.println(s.uniquePathsWithObstacles(obstacleGrid)); + } +} \ No newline at end of file From 93664f1b11013ad4c6b2fac8b972f7bc2284f777 Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 28 Nov 2020 15:17:07 +0800 Subject: [PATCH 21/29] up --- week06/q64_minimum_path_sum/Solution.java | 38 ++++++++++++++++++ week06/q64_minimum_path_sum/Solution2.java | 33 ++++++++++++++++ week06/q91_decode_ways/Solution.java | 46 ++++++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 week06/q64_minimum_path_sum/Solution.java create mode 100644 week06/q64_minimum_path_sum/Solution2.java create mode 100644 week06/q91_decode_ways/Solution.java diff --git a/week06/q64_minimum_path_sum/Solution.java b/week06/q64_minimum_path_sum/Solution.java new file mode 100644 index 00000000..59731343 --- /dev/null +++ b/week06/q64_minimum_path_sum/Solution.java @@ -0,0 +1,38 @@ +package q64_minimum_path_sum; + +/** + * 最小路径和 + * Solution: + * [i][j]的最短路径=min([i-1][j], [i][j-1]) + [i][j] + * 特别:[0][j]的最短路径只能是[0][j-1]+[0][j],[i][0]的最短路径只能是[i-1][0]+[i][0] + *

+ * Time:O(mn), Space: O(1) + * + * @Link: https://leetcode-cn.com/problems/minimum-path-sum/ + * @Author: liuchen created at 19:55 23/11/2020 + */ +public class Solution { + + public int minPathSum(int[][] grid) { + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[0].length; j++) { + if (i == 0 && j == 0) { + continue; + } else if (i == 0) { + grid[i][j] += grid[i][j - 1]; + } else if (j == 0) { + grid[i][j] += grid[i - 1][j]; + } else { + grid[i][j] += Math.min(grid[i][j - 1], grid[i - 1][j]); + } + } + } + return grid[grid.length - 1][grid[0].length - 1]; + } + + public static void main(String[] args) { + int[][] grid = {{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}; + Solution s = new Solution(); + System.out.println(s.minPathSum(grid)); + } +} \ No newline at end of file diff --git a/week06/q64_minimum_path_sum/Solution2.java b/week06/q64_minimum_path_sum/Solution2.java new file mode 100644 index 00000000..5c54f994 --- /dev/null +++ b/week06/q64_minimum_path_sum/Solution2.java @@ -0,0 +1,33 @@ +package q64_minimum_path_sum; + +public class Solution2 { + + public int minPathSum(int[][] grid) { + if (grid.length < 1 || grid[0].length < 1) { + return 0; + } + int m = grid.length; + int n = grid[0].length; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (i == 0 && j == 0) { + continue; + } + if (i == 0) { + grid[i][j] += grid[i][j - 1]; + } else if (j == 0) { + grid[i][j] += grid[i - 1][j]; + } else { + grid[i][j] += Math.min(grid[i][j - 1], grid[i - 1][j]); + } + } + } + return grid[m - 1][n - 1]; + } + + public static void main(String[] args) { + int[][] grid = {{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}; + Solution2 s = new Solution2(); + System.out.println(s.minPathSum(grid)); + } +} \ No newline at end of file diff --git a/week06/q91_decode_ways/Solution.java b/week06/q91_decode_ways/Solution.java new file mode 100644 index 00000000..02b7f1bb --- /dev/null +++ b/week06/q91_decode_ways/Solution.java @@ -0,0 +1,46 @@ +package q91_decode_ways; + +/** + * 解码方法 + *

+ * Solution: 动态规划,f(n) = f(n-1) + 1(最后2个数字在1-26内)|0 + *

+ * Time:,Space: + * + * @Link: https://leetcode-cn.com/problems/decode-ways/ + * @Author: liuchen created at 14:16 28/11/2020 + */ +public class Solution { + + public int numDecodings(String s) { + int len = s.length(); + if (len == 0) { + return 0; + } + if (s.charAt(0) == '0') { + return 0; + } + int[] dp = new int[len]; + dp[0] = 1; + for (int i = 1; i < len; i++) { + if (s.charAt(i) != '0') { + dp[i] = dp[i - 1]; + } + String subS = s.substring(i - 1, i + 1); + if (Integer.parseInt(subS) >= 10 && Integer.parseInt(subS) <= 26) { + if (i == 1) { + dp[i]++; + } else { + dp[i] += dp[i - 2]; + } + } + } + return dp[len - 1]; + } + + public static void main(String[] args) { + String str = "12"; + Solution s = new Solution(); + System.out.println(s.numDecodings(str)); + } +} \ No newline at end of file From e5cec90da004f44f44b35d5c5dd7afe21e26811e Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 28 Nov 2020 17:58:00 +0800 Subject: [PATCH 22/29] up --- .../Solution.java | 40 +++++++++++++++ .../Solution2.java | 49 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 week06/q1143_longest_common_subsequence/Solution.java create mode 100644 week06/q1143_longest_common_subsequence/Solution2.java diff --git a/week06/q1143_longest_common_subsequence/Solution.java b/week06/q1143_longest_common_subsequence/Solution.java new file mode 100644 index 00000000..e925c00a --- /dev/null +++ b/week06/q1143_longest_common_subsequence/Solution.java @@ -0,0 +1,40 @@ +package q1143_longest_common_subsequence; + +/** + * 最长公共子序列 + *

+ * Solution: 动态规划,转化为2维数组,f(i,j)表示[i,j]位置的最大公共子序列, 方程f(i,j) = + * text1[i] == text[j] : f(i-1,j-1) + 1 + * text1[i] != text[j] : Max( f(i-1,j), f(i,j-1) ) + *

+ * Time:O(n^2), Space:O(n^2) + * + * @Link: https://leetcode-cn.com/problems/longest-common-subsequence/ + * @Author: liuchen created at 17:45 20/11/2020 + */ +public class Solution { + public int longestCommonSubsequence(String text1, String text2) { + int m = text1.length(); + int n = text2.length(); + int[][] dp = new int[m + 1][n + 1]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + char c1 = text1.charAt(i); + char c2 = text2.charAt(j); + if (c1 == c2) { + dp[i + 1][j + 1] = dp[i][j] + 1; + } else { + dp[i + 1][j + 1] = Math.max(dp[i + 1][j], dp[i][j + 1]); + } + } + } + return dp[m][n]; + } + + public static void main(String[] args) { + String text1 = "abcde"; + String text2 = "ace"; + Solution s = new Solution(); + System.out.println(s.longestCommonSubsequence(text1, text2)); + } +} diff --git a/week06/q1143_longest_common_subsequence/Solution2.java b/week06/q1143_longest_common_subsequence/Solution2.java new file mode 100644 index 00000000..d0cd0023 --- /dev/null +++ b/week06/q1143_longest_common_subsequence/Solution2.java @@ -0,0 +1,49 @@ +package q1143_longest_common_subsequence; + +public class Solution2 { + public int longestCommonSubsequence(String text1, String text2) { + int m = text1.length(); + int n = text2.length(); + if (m < 1 || n < 1) { + return 0; + } + int[][] dp = new int[m][n]; + for (int i = 0; i < m; i++) { + char c1 = text1.charAt(i); + for (int j = 0; j < n; j++) { + char c2 = text2.charAt(j); + if (i == 0 && j == 0) { + dp[i][j] = c1 == c2 ? 1 : 0; + continue; + } + if (i == 0) { + if (c1 == c2) { + dp[i][j] = 1; + } else { + dp[i][j] = dp[i][j - 1]; + } + } else if (j == 0) { + if (c1 == c2) { + dp[i][j] = 1; + } else { + dp[i][j] = dp[i - 1][j]; + } + } else { + if (c1 == c2) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + } + } + return dp[m - 1][n - 1]; + } + + public static void main(String[] args) { + String text1 = "abcde"; + String text2 = "ace"; + Solution2 s = new Solution2(); + System.out.println(s.longestCommonSubsequence(text1, text2)); + } +} From f6d1159dcef2f97ab3a022081e34f8e9357b1741 Mon Sep 17 00:00:00 2001 From: liuchen Date: Sun, 6 Dec 2020 21:32:08 +0800 Subject: [PATCH 23/29] up --- week07/NOTE.md | 59 ++++++++++++- week07/q22_generate_parentheses/Solution.java | 47 +++++++++++ .../q22_generate_parentheses/Solution2.java | 59 +++++++++++++ week07/q36_valid_sudoku/Solution.java | 58 +++++++++++++ week07/q37_sudoku_solver/Solution.java | 82 ++++++++++++++++++ week07/q51_n_queens/Solution.java | 84 +++++++++++++++++++ week07/q70_climbing_stairs/Solution.java | 37 ++++++++ week07/q70_climbing_stairs/Solution2.java | 28 +++++++ week07/q70_climbing_stairs/Solution3.java | 24 ++++++ week07/q70_climbing_stairs/Solution4.java | 31 +++++++ week07/q70_climbing_stairs/Solution5.java | 37 ++++++++ 11 files changed, 545 insertions(+), 1 deletion(-) create mode 100644 week07/q22_generate_parentheses/Solution.java create mode 100644 week07/q22_generate_parentheses/Solution2.java create mode 100644 week07/q36_valid_sudoku/Solution.java create mode 100644 week07/q37_sudoku_solver/Solution.java create mode 100644 week07/q51_n_queens/Solution.java create mode 100644 week07/q70_climbing_stairs/Solution.java create mode 100644 week07/q70_climbing_stairs/Solution2.java create mode 100644 week07/q70_climbing_stairs/Solution3.java create mode 100644 week07/q70_climbing_stairs/Solution4.java create mode 100644 week07/q70_climbing_stairs/Solution5.java diff --git a/week07/NOTE.md b/week07/NOTE.md index 50de3041..7352433a 100644 --- a/week07/NOTE.md +++ b/week07/NOTE.md @@ -1 +1,58 @@ -学习笔记 \ No newline at end of file +# 字典树 Trie +# 并查集 +``` +def init(p): + for i in range(n) + p[i] = i + +def union(self, p, i, j): + p1 = self.parent(p,i) + p2 = self.parent(p,j) + p[p1] = p2 + +def parent(self, p, i): + root = i + while p[root] != root: + root = p[root] + while p[i] != i + x=i; i=p[i]; p[x]=root + return root +``` + +# A* search +``` +def AstarSearch(graph, start, end): + pq = collections.priority_queue() + pq.append([start]) + visited.add(start) + + while pq: + node = pq.pop() + visited.add(node) + + process(node) + nodes = generate_related_nodes(node) + unvisited = [node for node in nodes if node not in visited] + pq.push(unvisited) +``` + +# AVL +* 平衡二叉搜索树 +* 每个节点需要存balance factor = {-1,0,1} +* 平衡因子: 左子树高度 - 右子树高度 +* 旋转操作 + * 左旋 + * 右旋 + * 左右旋 + * 右左旋 + +# 红黑树 +* 近似平衡的二叉搜索树,任意节点左右子树高度差小于两倍 +* 每个节点是红或黑 +* 根节点是黑 +* 每个叶子节点是黑 +* 不能有相邻居接的两个红色节点 +* 从任意节点到其每个叶子的所有路径都包含相同数据的黑节点 +* 读多用AVL,写多用红黑树 +* AVL应用: database +* 红黑树应用: map, set \ No newline at end of file diff --git a/week07/q22_generate_parentheses/Solution.java b/week07/q22_generate_parentheses/Solution.java new file mode 100644 index 00000000..ee81ef76 --- /dev/null +++ b/week07/q22_generate_parentheses/Solution.java @@ -0,0 +1,47 @@ +package q22_generate_parentheses; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 括号生成 + *

+ * Solution: 左括号使用数量必须大于等于右括号使用数量,当前才有效 + * + * @Link: https://leetcode-cn.com/problems/generate-parentheses/ + * @Author: liuchen created at 23:37 2020-11-03 + */ +public class Solution { + + private List list; + + public List generateParenthesis(int n) { + list = new ArrayList<>(); + generator(new StringBuffer(), 0, 0, n); + return list; + } + + private void generator(StringBuffer sb, int left, int right, int max) { + if (sb.length() == max * 2) { + list.add(sb.toString()); + return; + } + if (left < max) { + sb.append('('); + generator(sb, left + 1, right, max); + sb.deleteCharAt(sb.length() - 1); + } + if (right < left) { + sb.append(')'); + generator(sb, left, right + 1, max); + sb.deleteCharAt(sb.length() - 1); + } + } + + public static void main(String[] args) { + int n = 3; + Solution s = new Solution(); + System.out.println(Arrays.toString(s.generateParenthesis(n).toArray())); + } +} diff --git a/week07/q22_generate_parentheses/Solution2.java b/week07/q22_generate_parentheses/Solution2.java new file mode 100644 index 00000000..56f5ec3b --- /dev/null +++ b/week07/q22_generate_parentheses/Solution2.java @@ -0,0 +1,59 @@ +package q22_generate_parentheses; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * 括号生成 + *

+ * Solution: DFS+剪枝, 核心思路-当前使用的左括号数量>=当前使用的右括号数量才算有效,否则进行剪枝 + *

+ * Time: O(n^n) ??, Space:O(n) + * + * @Link: https://leetcode-cn.com/problems/generate-parentheses/ + * @Author: liuchen created at 23:37 2020-11-03 + */ +public class Solution2 { + + public List generateParenthesis(int n) { + if (n <= 0) { + return Collections.emptyList(); + } + List list = new ArrayList<>(); + dfs("", n, n, list); + return list; + } + + /** + * DFS + * + * @param curStr 当前递归得到结果 + * @param left 左括号剩余数量 + * @param right 右括号剩余数量 + * @param list 结果集 + */ + private void dfs(String curStr, int left, int right, List list) { + if (left == 0 && right == 0) { + list.add(curStr); + return; + } + // 剪枝 + if (left > right) { + return; + } + if (left > 0) { + dfs(curStr + "(", left - 1, right, list); + } + if (right > 0) { + dfs(curStr + ")", left, right - 1, list); + } + } + + public static void main(String[] args) { + int n = 3; + Solution2 s = new Solution2(); + System.out.println(Arrays.toString(s.generateParenthesis(n).toArray())); + } +} diff --git a/week07/q36_valid_sudoku/Solution.java b/week07/q36_valid_sudoku/Solution.java new file mode 100644 index 00000000..e2959e55 --- /dev/null +++ b/week07/q36_valid_sudoku/Solution.java @@ -0,0 +1,58 @@ +package q36_valid_sudoku; + +/** + * 有效的数独 + *

+ * Solution: 遍历一遍,同时记录 行/列/BOX 中已出现的数字,遇到重复则失败, 其中9x9里i,j定位box=j/3+(i/3)*3 + *

+ * Time:O(n),Space:O(n) + * + * @Link: https://leetcode-cn.com/problems/valid-sudoku/description/ + * @Author: liuchen created at 15:48 5/12/2020 + */ +public class Solution { + public boolean isValidSudoku(char[][] board) { + int[][] rows = new int[9][10]; + int[][] cols = new int[9][10]; + int[][] boxes = new int[9][10]; + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + // 空,跳过 + if (board[i][j] == '.') { + continue; + } + int num = Integer.parseInt(String.valueOf(board[i][j])); + if (rows[i][num] == 1) { + return false; + } + if (cols[j][num] == 1) { + return false; + } + int boxIdx = j / 3 + (i / 3) * 3; + if (boxes[boxIdx][num] == 1) { + return false; + } + rows[i][num] = 1; + cols[j][num] = 1; + boxes[boxIdx][num] = 1; + } + } + return true; + } + + public static void main(String[] args) { + char[][] board = new char[][]{ + {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, + {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, + {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, + {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, + {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, + {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, + {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, + {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, + {'.', '.', '.', '.', '8', '.', '.', '7', '9'}, + }; + Solution s = new Solution(); + System.out.println(s.isValidSudoku(board)); + } +} diff --git a/week07/q37_sudoku_solver/Solution.java b/week07/q37_sudoku_solver/Solution.java new file mode 100644 index 00000000..f2a2539b --- /dev/null +++ b/week07/q37_sudoku_solver/Solution.java @@ -0,0 +1,82 @@ +package q37_sudoku_solver; + +/** + * 解数独 + *

+ * Solution: + * 先根据board 初始化 行/列/块 中已使用的数字 + * 遍历board,对每个空位,循环尝试1~9, 每次尝试都验证 行/列/块 是否有重复数字,有则失败 + *

+ * Time:O(n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/sudoku-solver/ + * @Author: liuchen created at 16:51 5/12/2020 + */ +public class Solution { + public void solveSudoku(char[][] board) { + boolean[][] rows = new boolean[9][10]; + boolean[][] cols = new boolean[9][10]; + boolean[][] boxes = new boolean[9][10]; + for (int i = 0; i < board.length; i++) { + for (int j = 0; j < board[0].length; j++) { + if (board[i][j] == '.') { + continue; + } + int num = Integer.parseInt(String.valueOf(board[i][j])); + rows[i][num] = true; + cols[j][num] = true; + boxes[j / 3 + (i / 3) * 3][num] = true; + } + } + solve(board, rows, cols, boxes, 0, 0); + } + + private boolean solve(char[][] board, boolean[][] rows, boolean[][] cols, boolean[][] boxes, int row, int col) { + // 最后一列 + if (col == board[0].length) { + col = 0; + row++; + // 最后一行&最后一列 + if (row == board.length) { + return true; + } + } + // 遇到已填写的,进行下一列 + if (board[row][col] != '.') { + return solve(board, rows, cols, boxes, row, col + 1); + } + for (int num = 1; num <= 9; num++) { + if (rows[row][num] || cols[col][num] || boxes[col / 3 + (row / 3) * 3][num]) { + continue; + } + rows[row][num] = true; + cols[col][num] = true; + boxes[col / 3 + (row / 3) * 3][num] = true; + board[row][col] = (char) ('0' + num); + if (solve(board, rows, cols, boxes, row, col + 1)) { + return true; + } + board[row][col] = '.'; + rows[row][num] = false; + cols[col][num] = false; + boxes[col / 3 + (row / 3) * 3][num] = false; + } + return false; + } + + public static void main(String[] args) { + char[][] board = new char[][]{ + {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, + {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, + {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, + {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, + {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, + {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, + {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, + {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, + {'.', '.', '.', '.', '8', '.', '.', '7', '9'}, + }; + Solution s = new Solution(); + s.solveSudoku(board); + } +} diff --git a/week07/q51_n_queens/Solution.java b/week07/q51_n_queens/Solution.java new file mode 100644 index 00000000..59077700 --- /dev/null +++ b/week07/q51_n_queens/Solution.java @@ -0,0 +1,84 @@ +package q51_n_queens; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * N皇后 + *

+ * Solution: 回溯+剪枝 + *

+ * Time: , Space: + * + * @Link: https://leetcode-cn.com/problems/n-queens/ + * @Author: liuchen created at 14:55 5/12/2020 + */ +public class Solution { + public List> solveNQueens(int n) { + // 非法参数 + if (n <= 0) { + return Collections.emptyList(); + } + // 初始化棋盘 + char[][] chess = new char[n][n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + chess[i][j] = '.'; + } + } + List> lists = new ArrayList<>(); + solve(chess, 0, lists); + return lists; + } + + private void solve(char[][] chess, int row, List> lists) { + if (row == chess.length) { + lists.add(construct(chess)); + return; + } + for (int col = 0; col < chess.length; col++) { + if (valid(chess, row, col)) { + chess[row][col] = 'Q'; + solve(chess, row + 1, lists); + chess[row][col] = '.'; + } + } + } + + private boolean valid(char[][] chess, int row, int col) { + // 判断之前走过的行,在这列是否有Q + for (int i = 0; i < row; i++) { + if (chess[i][col] == 'Q') { + return false; + } + } + // 判断右上角是否有Q + for (int i = row - 1, j = col + 1; i >= 0 && j < chess.length; i--, j++) { + if (chess[i][j] == 'Q') { + return false; + } + } + // 判断左上角是否有Q + for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { + if (chess[i][j] == 'Q') { + return false; + } + } + return true; + } + + private List construct(char[][] chess) { + List path = new ArrayList<>(); + for (int i = 0; i < chess.length; i++) { + path.add(new String(chess[i])); + } + return path; + } + + public static void main(String[] args) { + int n = 8; + Solution s = new Solution(); + System.out.println(s.solveNQueens(n)); + } +} diff --git a/week07/q70_climbing_stairs/Solution.java b/week07/q70_climbing_stairs/Solution.java new file mode 100644 index 00000000..937722a3 --- /dev/null +++ b/week07/q70_climbing_stairs/Solution.java @@ -0,0 +1,37 @@ +package q70_climbing_stairs; + +import java.util.HashMap; + +/** + * 爬楼梯 + * + * Solution: 核心点,第n阶的方法表达式 f(n) = f(n-1) + f(n-2) + * + * Solution1: 动态规划, Time: O(n), Space: O(1) + * Solution2: 递归, Time: O(2^n), Space: O(n) + * + * @Link: https://leetcode-cn.com/problems/climbing-stairs/ + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution { + + HashMap map = new HashMap<>(); + + public int climbStairs(int n) { + if (this.map.containsKey(n)) { + return this.map.get(n); + } + if (n < 3) { + return n; + } + int m = climbStairs(n - 1) + climbStairs(n - 2); + this.map.put(n, m); + return m; + } + + public static void main(String[] args) { + int n = 3; + Solution s = new Solution(); + System.out.println(s.climbStairs(n)); + } +} diff --git a/week07/q70_climbing_stairs/Solution2.java b/week07/q70_climbing_stairs/Solution2.java new file mode 100644 index 00000000..f39117be --- /dev/null +++ b/week07/q70_climbing_stairs/Solution2.java @@ -0,0 +1,28 @@ +package q70_climbing_stairs; + +/** + * @Description: + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution2 { + + public int climbStairs(int n) { + if (n < 3) { + return n; + } + int preTwo = 1; + int preOne = 2; + for (int i = 3; i < n; i++) { + int tmp = preOne; + preOne = preOne + preTwo; + preTwo = tmp; + } + return preOne + preTwo; + } + + public static void main(String[] args) { + int n = 4; + Solution2 s = new Solution2(); + System.out.println(s.climbStairs(n)); + } +} diff --git a/week07/q70_climbing_stairs/Solution3.java b/week07/q70_climbing_stairs/Solution3.java new file mode 100644 index 00000000..42298f72 --- /dev/null +++ b/week07/q70_climbing_stairs/Solution3.java @@ -0,0 +1,24 @@ +package q70_climbing_stairs; + +/** + * @Description: + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution3 { + + public int climbStairs(int n) { + if (n == 1) { + return 1; + } + if (n == 2) { + return 2; + } + return climbStairs(n - 1) + climbStairs(n - 2); + } + + public static void main(String[] args) { + int n = 3; + Solution3 s = new Solution3(); + System.out.println(s.climbStairs(n)); + } +} diff --git a/week07/q70_climbing_stairs/Solution4.java b/week07/q70_climbing_stairs/Solution4.java new file mode 100644 index 00000000..bbbafa31 --- /dev/null +++ b/week07/q70_climbing_stairs/Solution4.java @@ -0,0 +1,31 @@ +package q70_climbing_stairs; + +/** + * @Description: + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution4 { + + public int climbStairs(int n) { + if (n == 1) { + return 1; + } + if (n == 2) { + return 2; + } + int preTwo = 1; + int preOne = 2; + for(int i = 3; i + * Solution:动态规划 dp[n] = dp[n-1] + dp[n-2] + *

+ * Time:O(n),Space:O(1) + * + * @Link: https://leetcode-cn.com/problems/climbing-stairs/description/ + * @Author: liuchen created at 15:34 2020-10-22 + */ +public class Solution5 { + + public int climbStairs(int n) { + if (n < 1) { + return 0; + } + if (n < 3) { + return n; + } + int preOne = 2; + int preTwo = 1; + for (int i = 3; i < n; i++) { + int tmp = preOne; + preOne += preTwo; + preTwo = tmp; + } + return preOne + preTwo; + } + + public static void main(String[] args) { + int n = 4; + Solution5 s = new Solution5(); + System.out.println(s.climbStairs(n)); + } +} From 4ad9dd676d760d8c4a56f5f5175d865c5734f881 Mon Sep 17 00:00:00 2001 From: liuchen Date: Sun, 6 Dec 2020 23:08:33 +0800 Subject: [PATCH 24/29] up --- .../Solution.java | 24 +++++++ .../q208_implement_trie_prefix_tree/Trie.java | 62 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 week07/q208_implement_trie_prefix_tree/Solution.java create mode 100644 week07/q208_implement_trie_prefix_tree/Trie.java diff --git a/week07/q208_implement_trie_prefix_tree/Solution.java b/week07/q208_implement_trie_prefix_tree/Solution.java new file mode 100644 index 00000000..954744f9 --- /dev/null +++ b/week07/q208_implement_trie_prefix_tree/Solution.java @@ -0,0 +1,24 @@ +package q208_implement_trie_prefix_tree; + +/** + * 实现 Trie (前缀树) + *

+ * Solution: + *

+ * Time:,Space: + * + * @Link: https://leetcode-cn.com/problems/implement-trie-prefix-tree/ + * @Author: liuchen created at 21:26 6/12/2020 + */ +public class Solution { + + public static void main(String[] args) { + String word = "apple"; + String prefix = "app"; + Trie trie = new Trie(); + trie.insert(word); + System.out.println(trie.search(word)); + System.out.println(trie.search(prefix)); + System.out.println(trie.startsWith(prefix)); + } +} diff --git a/week07/q208_implement_trie_prefix_tree/Trie.java b/week07/q208_implement_trie_prefix_tree/Trie.java new file mode 100644 index 00000000..a5e505a8 --- /dev/null +++ b/week07/q208_implement_trie_prefix_tree/Trie.java @@ -0,0 +1,62 @@ +package q208_implement_trie_prefix_tree; + +/** + * @Description: + * @Author: liuchen created at 21:33 6/12/2020 + */ +public class Trie { + + private boolean is_string = false; + private Trie next[] = new Trie[26]; + + /** + * Initialize your data structure here. + */ + public Trie() { + } + + /** + * Inserts a word into the trie. + */ + public void insert(String word) { + Trie root = this; + char w[] = word.toCharArray(); + for (int i = 0; i < w.length; i++) { + if (root.next[w[i] - 'a'] == null) { + root.next[w[i] - 'a'] = new Trie(); + } + root = root.next[w[i] - 'a']; + } + root.is_string = true; + } + + /** + * Returns if the word is in the trie. + */ + public boolean search(String word) { + Trie root = this; + char w[] = word.toCharArray(); + for (int i = 0; i < w.length; i++) { + if (root.next[w[i] - 'a'] == null) { + return false; + } + root = root.next[w[i] - 'a']; + } + return root.is_string; + } + + /** + * Returns if there is any word in the trie that starts with the given prefix. + */ + public boolean startsWith(String prefix) { + Trie root = this; + char p[] = prefix.toCharArray(); + for (int i = 0; i < p.length; i++) { + if (root.next[p[i] - 'a'] == null) { + return false; + } + root = root.next[p[i] - 'a']; + } + return true; + } +} From 254d7e2ddea3d105cb734c04f80197b5bb204031 Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 12 Dec 2020 16:25:49 +0800 Subject: [PATCH 25/29] up --- week08/NOTE.md | 36 +++++++- week08/q146_lru_cache/LRUCache.java | 109 +++++++++++++++++++++++ week08/q56_merge_intervals/Solution.java | 39 ++++++++ 3 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 week08/q146_lru_cache/LRUCache.java create mode 100644 week08/q56_merge_intervals/Solution.java diff --git a/week08/NOTE.md b/week08/NOTE.md index 50de3041..cb4c5a8f 100644 --- a/week08/NOTE.md +++ b/week08/NOTE.md @@ -1 +1,35 @@ -学习笔记 \ No newline at end of file +# 位运算 +# 布隆过滤器 Bloom Filter +* 不在 一定 不在 +* 在 不一定 在 +* 比特币网络/MapReduce/Redis + +# LRU Cache +* 最少最近被使用 least recently used + +# 排序算法 +* 比较类排序 + * 交换排序 + * 冒泡排序 + * 快速排序 O(nlogn) + * 插入排序 + * 简单插入排序 + * 希尔排序 + * 选择排序 + * 简单选择排序 + * 堆排序 O(nlogn) + * 归并排序 O(nlogn) + * 二路归并排序 + * 多路归并排序 +* 非比较类排序 + * 计数排序 + * 桶排序 + * 基数排序 + +# 初级排序 O(n^2) +* 选择排序:每次找最小值 +* 插入排序 +* 冒泡排序 + +# 高级排序 O(nlogn) +* 快速排序 \ No newline at end of file diff --git a/week08/q146_lru_cache/LRUCache.java b/week08/q146_lru_cache/LRUCache.java new file mode 100644 index 00000000..2beb91ae --- /dev/null +++ b/week08/q146_lru_cache/LRUCache.java @@ -0,0 +1,109 @@ +package q146_lru_cache; + +import java.util.HashMap; +import java.util.Map; + +/** + * LRU 缓存机制 + *

+ * Solution: + *

+ * Time:,Space: + * + * @Link: https://leetcode-cn.com/problems/lru-cache/ + * @Author: liuchen created at 16:55 2020-09-29 + */ +public class LRUCache { + + static class DLinkedNode { + int key; + int value; + DLinkedNode prev; + DLinkedNode next; + + public DLinkedNode() { + } + + public DLinkedNode(int k, int v) { + key = k; + value = v; + } + } + + private Map cache = new HashMap(); + private int size; + private int capacity; + private DLinkedNode head, tail; + + public LRUCache(int capacity) { + size = 0; + this.capacity = capacity; + head = new DLinkedNode(); + tail = new DLinkedNode(); + head.next = tail; + tail.prev = head; + } + + public int get(int key) { + DLinkedNode node = cache.get(key); + if (node == null) { + return -1; + } + moveToHead(node); + return node.value; + } + + public void put(int key, int value) { + DLinkedNode node = cache.get(key); + if (node == null) { + DLinkedNode newNode = new DLinkedNode(key, value); + cache.put(key, newNode); + addToHead(newNode); + ++size; + if (size > capacity) { + DLinkedNode tail = removeTail(); + cache.remove(tail.key); + --size; + } + } else { + node.value = value; + moveToHead(node); + } + } + + private void addToHead(DLinkedNode node) { + node.prev = head; + node.next = head.next; + head.next.prev = node; + head.next = node; + } + + private void removeNode(DLinkedNode node) { + node.prev.next = node.next; + node.next.prev = node.prev; + } + + private void moveToHead(DLinkedNode node) { + removeNode(node); + addToHead(node); + } + + private DLinkedNode removeTail() { + DLinkedNode res = tail.prev; + removeNode(res); + return res; + } + + public static void main(String[] args) { + LRUCache cache = new LRUCache(2); + cache.put(1, 1); + cache.put(2, 2); + System.out.println(cache.get(1)); + cache.put(3, 3); + System.out.println(cache.get(2)); + cache.put(4, 4); + System.out.println(cache.get(1)); + System.out.println(cache.get(3)); + System.out.println(cache.get(4)); + } +} diff --git a/week08/q56_merge_intervals/Solution.java b/week08/q56_merge_intervals/Solution.java new file mode 100644 index 00000000..e8331279 --- /dev/null +++ b/week08/q56_merge_intervals/Solution.java @@ -0,0 +1,39 @@ +package q56_merge_intervals; + +import java.util.Arrays; + +/** + * 合并区间 + *

+ * Solution: + * 先对数组以左节点ASC排序, + * 然后遍历数组,判断 左>前一个右 + * 是则无交集 + * 否则有交集,更新前一个元素的右节点=MAX(pre.right, cur.right) + *

+ * Time:O(nlogn), Space:O(1) + * + * @Link: https://leetcode-cn.com/problems/merge-intervals/ + * @Author: liuchen created at 16:04 12/12/2020 + */ +public class Solution { + public int[][] merge(int[][] intervals) { + Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]); + int[][] res = new int[intervals.length][2]; + int idx = -1; + for (int[] interval : intervals) { + if (idx == -1 || interval[0] > res[idx][1]) { + res[++idx] = interval; + } else { + res[idx][1] = Math.max(res[idx][1], interval[1]); + } + } + return Arrays.copyOf(res, idx + 1); + } + + public static void main(String[] args) { + int[][] intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}}; + Solution s = new Solution(); + s.merge(intervals); + } +} From 0c7a62d68540adfe9ad175eda40006e9475506f7 Mon Sep 17 00:00:00 2001 From: liuchen Date: Sat, 19 Dec 2020 15:09:06 +0800 Subject: [PATCH 26/29] up --- week09/NOTE.md | 7 ++- .../Solution.java | 38 +++++++++++++++ week09/q91_decode_ways/Solution.java | 46 +++++++++++++++++++ week09/q91_decode_ways/Solution2.java | 35 ++++++++++++++ 4 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 week09/q300_longest_increasing_subsequence/Solution.java create mode 100644 week09/q91_decode_ways/Solution.java create mode 100644 week09/q91_decode_ways/Solution2.java diff --git a/week09/NOTE.md b/week09/NOTE.md index 50de3041..1b7c044e 100644 --- a/week09/NOTE.md +++ b/week09/NOTE.md @@ -1 +1,6 @@ -学习笔记 \ No newline at end of file +# 字符串匹配算法 +* 暴力法 +* Rabin-Krap算法 +* KMP算法 +* Boyer-Moore算法 +* Sunday算法 \ No newline at end of file diff --git a/week09/q300_longest_increasing_subsequence/Solution.java b/week09/q300_longest_increasing_subsequence/Solution.java new file mode 100644 index 00000000..a72916ac --- /dev/null +++ b/week09/q300_longest_increasing_subsequence/Solution.java @@ -0,0 +1,38 @@ +package q300_longest_increasing_subsequence; + +/** + * 最长递增子序列 + *

+ * Solution:动态规划 dp[i] = Max(dp[i-1]) + 1, MaxLen = Max(dp[i]) + *

+ * Time: O(n^n),Space:O(n) + * + * @Link: https://leetcode-cn.com/problems/longest-increasing-subsequence/ + * @Author: liuchen created at 14:25 19/12/2020 + */ +public class Solution { + public int lengthOfLIS(int[] nums) { + if (nums == null || nums.length == 0) { + return 0; + } + int[] dp = new int[nums.length]; + dp[0] = 1; + int len = 1; + for (int i = 1; i < nums.length; i++) { + dp[i] = 1; + for (int j = 0; j < i; j++) { + if (nums[i] > nums[j]) { + dp[i] = Math.max(dp[i], dp[j] + 1); + } + } + len = Math.max(len, dp[i]); + } + return len; + } + + public static void main(String[] args) { + int[] nums = new int[]{10, 9, 2, 5, 3, 7, 101, 18}; + Solution s = new Solution(); + System.out.println(s.lengthOfLIS(nums)); + } +} diff --git a/week09/q91_decode_ways/Solution.java b/week09/q91_decode_ways/Solution.java new file mode 100644 index 00000000..33e34dd8 --- /dev/null +++ b/week09/q91_decode_ways/Solution.java @@ -0,0 +1,46 @@ +package q91_decode_ways; + +/** + * 解码方法 + *

+ * Solution: 动态规划,f(n) = f(n-1) + 0|f(n-2)(最后2个数字在1-26内) + *

+ * Time:,Space: + * + * @Link: https://leetcode-cn.com/problems/decode-ways/ + * @Author: liuchen created at 14:16 28/11/2020 + */ +public class Solution { + + public int numDecodings(String s) { + int len = s.length(); + if (len == 0) { + return 0; + } + if (s.charAt(0) == '0') { + return 0; + } + int[] dp = new int[len]; + dp[0] = 1; + for (int i = 1; i < len; i++) { + if (s.charAt(i) != '0') { + dp[i] = dp[i - 1]; + } + String subS = s.substring(i - 1, i + 1); + if (Integer.parseInt(subS) >= 10 && Integer.parseInt(subS) <= 26) { + if (i == 1) { + dp[i]++; + } else { + dp[i] += dp[i - 2]; + } + } + } + return dp[len - 1]; + } + + public static void main(String[] args) { + String str = "12"; + Solution s = new Solution(); + System.out.println(s.numDecodings(str)); + } +} \ No newline at end of file diff --git a/week09/q91_decode_ways/Solution2.java b/week09/q91_decode_ways/Solution2.java new file mode 100644 index 00000000..7d35fcf6 --- /dev/null +++ b/week09/q91_decode_ways/Solution2.java @@ -0,0 +1,35 @@ +package q91_decode_ways; + +public class Solution2 { + + public int numDecodings(String s) { + if (s == null || s.length() == 0) { + return 0; + } + if (s.charAt(0) == '0') { + return 0; + } + int[] dp = new int[s.length()]; + dp[0] = 1; + for (int i = 1; i < s.length(); i++) { + if (s.charAt(i) != '0') { + dp[i] = dp[i - 1]; + } + String str = s.substring(i - 1, i + 1); + if (Integer.parseInt(str) >= 10 && Integer.parseInt(str) <= 26) { + if (i == 1) { + dp[i]++; + } else { + dp[i] += dp[i - 2]; + } + } + } + return dp[s.length() - 1]; + } + + public static void main(String[] args) { + String str = "12"; + Solution2 s = new Solution2(); + System.out.println(s.numDecodings(str)); + } +} \ No newline at end of file From b0e586b9b222f727c1c56a68168b4fe2070912c1 Mon Sep 17 00:00:00 2001 From: liuchen Date: Tue, 22 Dec 2020 13:27:18 +0800 Subject: [PATCH 27/29] up --- summary.pdf | Bin 0 -> 74727 bytes week10/NOTE.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 summary.pdf diff --git a/summary.pdf b/summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c54b09d00d319e840997c5239db4202b578f4698 GIT binary patch literal 74727 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�aL^n(~Hj8TKi7We;%Q`TidlvHS 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 literal 0 HcmV?d00001 diff --git a/week10/NOTE.md b/week10/NOTE.md index 50de3041..077e417f 100644 --- a/week10/NOTE.md +++ b/week10/NOTE.md @@ -1 +1,56 @@ -学习笔记 \ No newline at end of file +# 一维 + * 基础 + * 数组array(string) + * 链表linked list + * 高级 + * 栈stack + * 队列queue + * 双端队列deque + * 集合set + * 映射map +# 二维 + * 基础 + * 树tree + * 图graph + * 高级 + * 二叉搜索树 binary search tree (red-black tree, AVL) + * 堆 heap + * 并查集 disjoint set + * 字典树 Trie +# 特殊 + * 位运算 Bitwise + * 布隆过滤器 BloomFilter + * LRU Cache + +# 时间复杂度表 + * https://www.bigocheatsheet.com/ + +# 算法 + * if-else, switch -> branch + * for, while, loop -> lteration + * 递归 Recursion + * 搜索 Search + * 深度优先遍历DFS + * 广度优先遍历BFS + * 动态规划 Dynaic Programming + * 二分查找 Binary Search + * 贪心 Greedy + * 数学 Math, 几何 Geometry + +# 经典习题 + * 爬楼梯、硬币兑换 + * 括号匹配、括号生成、直方图最大面积、滑动窗口 + * 二叉树遍历、分层输出树、判断二叉排序树 + * 股票买卖、偷房子、字符串编辑距离、最长升子序列、最大公共子序列 + * 异位词(判断和归类)、回文串(最大回文串)、regex和通配符问题 + * 高级数据结构(Trie、BloomFilter、LRU cache) + +# 刷题路线 + * 基础 + 1. 两数之和 https://leetcode-cn.com/problems/two-sum/ + 20. 有效的括号 https://leetcode-cn.com/problems/valid-parentheses/ + 394. 字符串解码 https://leetcode-cn.com/problems/decode-string/ + 146. LRU 缓存机制 https://leetcode-cn.com/problems/lru-cache/ + 208. 实现 Trie (前缀树) https://leetcode-cn.com/problems/implement-trie-prefix-tree/ + 212. 单词搜索 II https://leetcode-cn.com/problems/word-search-ii/ + 389. 找不同 https://leetcode-cn.com/problems/find-the-difference/ \ No newline at end of file From ec415581ca889c1c4135c106b790010aed7fda98 Mon Sep 17 00:00:00 2001 From: liuchen Date: Mon, 28 Dec 2020 23:44:33 +0800 Subject: [PATCH 28/29] up --- week01/NOTE.md | 2 +- week10/summary.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 week10/summary.md diff --git a/week01/NOTE.md b/week01/NOTE.md index 0a60ac20..2f19320c 100644 --- a/week01/NOTE.md +++ b/week01/NOTE.md @@ -24,7 +24,7 @@ * iteration : for, while, loop * 递归 recursion * 搜索 search : 深度优先 Depth first search, 广度优先 Breadth first search -* 动态规划 Dynamic Progreamming +* 动态规划 Dynamic Programming * 二分查找 Binary search * 贪心 Greedy * 数学 Math, 几何 Geometry diff --git a/week10/summary.md b/week10/summary.md new file mode 100644 index 00000000..b24532c3 --- /dev/null +++ b/week10/summary.md @@ -0,0 +1,81 @@ +# 数据结构 +* 一维 + * 数组 array + * prepend/append/search O(1) + * insert/delete O(n) + * 链表 linked list + * prepend/append/insert/delete O(1) + * search O(n) + * 栈 stack + * 先进后出 + * insert/delete O(1) + * search O(n) + * 队列 queue + * 先进先出 + * insert/delete O(1) + * search O(n) + * 双端队列 deque (Double-End Queue) + * insert/delete O(1) + * search O(n) + * 集合 set + * insert/delete/lookup O(1) + * 字典 map + * insert/delete/lookup O(1) + * 碰撞 + * 不同值, hash后相同 + * 解决方案,节点变链表 + * size越小,越容易碰撞,时间复杂度越高 +* 二维 + * 树 tree + * 时间 + * insert/delete/search O(log n) + * 遍历 + * 前序遍历(Pre-order):根-左-右 + * 第一个节点是root + * 中序遍历(In-order):左-根-右 + * root左边是左子树,root右边是右子树 + * 已知前序遍历和中序遍历,可推断出整个树 + * 后序遍历(Post-order):左-右-根 + * 图 graph(V, E) + * V - vertex: 点 + * E - edge: 边 + * 二叉搜索树 binary search tree + * insert/delete/lookup O(log n) + * 堆 heap + * 迅速找到 MIN(小顶堆)或MAX(大顶堆) + * 二叉堆 (完全二叉树) + * fib堆 + * 大顶堆 + * find-max O(1) + * delete-max O(log n) + * insert/create O(log n) / O(1) + * 放到数组里 + * 索引为i的左子的索引是:2*i+1 + * 索引为i的右子的索引是:2*i+2 + * 索引为i的父的索引是:floor((i-1)/2) + * insert + * 放到最尾部 + * 逐步向上做替换,if > 父, 和父替换 (heapifyUp) + * 最大操作数为树的深度,即O(logN) + * delete-max + * 移除顶部元素 + * 将尾部元素i放到顶部 + * 逐步将i与左右子中大者替换 (heapifyDown) + * 最大操作数为树的深度,即O(logN) + * 工程中-优先级队列(priority_queue) + * 并查集 disjoint set + * 字典树 trie +* 特殊 + * 位运算 Bitwise + * 布隆过滤器 BloomFilter + * LRU cache + +# 算法 +* branch : if-else, switch +* iteration : for, while, loop +* 递归 recursion +* 搜索 search : 深度优先 Depth first search, 广度优先 Breadth first search +* 动态规划 Dynamic Programming +* 二分查找 Binary search +* 贪心 Greedy +* 数学 Math, 几何 Geometry \ No newline at end of file From f9108c29c65b3c0ea027c68984b0e911a5fbef83 Mon Sep 17 00:00:00 2001 From: liuchen Date: Wed, 9 Jun 2021 13:47:28 +0800 Subject: [PATCH 29/29] =?UTF-8?q?up#[=E5=85=B6=E4=BB=96]up?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week10/leetcode.md | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 week10/leetcode.md diff --git a/week10/leetcode.md b/week10/leetcode.md new file mode 100644 index 00000000..723d6df6 --- /dev/null +++ b/week10/leetcode.md @@ -0,0 +1,82 @@ +# 基础 +两数之和(简单) +有效的括号(简单) +字符串解码(中等) +LRU 缓存机制(困难) +实现 Trie(前缀树)(中等) +添加与搜索单词 - 数据结构设计(中等) +单词搜索 II (困难) +找不同(简单) +单词规律(简单) +字符串中的第一个唯一字符(简单) +无重复字符的最长子串(中等) +最小覆盖子串(困难) +合并两个有序链表(简单) +环形链表(简单) +环形链表 II (中等) +反转链表(简单) +反转链表 II (中等) +旋转链表(中等) +排序链表 +链表中倒数第 k 个节点 +两两交换链表中的节点(中等) +按奇偶排序数组(简单) +按奇偶排序数组 II (简单) +有序数组的平方(简单) +山脉数组的峰顶索引(简单) +搜索旋转排序数组(困难) +搜索旋转排序数组 II (中等) +寻找旋转排序数组中的最小值(中等) +寻找旋转排序数组中的最小值 II (困难) +搜索二维矩阵(中等) +等式方程的可满足性(中等) +朋友圈(中等) +账户合并(中等) +# 深度优先搜索 +二叉树的最大深度(简单) +路径总和(简单) +路径总和 II (中等) +被围绕的区域(中等) +岛屿数量(中等) +岛屿的最大面积(中等) +在二叉树中分配硬币(中等) +# 回溯 +括号生成(中等) +N 皇后(困难) +N 皇后 II (困难) +解数独 (中等) +不同路径 III (困难) +单词搜索(中等) +# 分治 +搜索二维矩阵 II (中等) +合并 K 个排序链表(中等) +为运算表达式设计优先级(中等) +给表达式添加运算符(困难) +数组中的第 K 个最大元素(中等) +最接近原点的 K 个点(中等) +鸡蛋掉落(困难) +# 动态规划 +使用最小花费爬楼梯(简单) +爬楼梯(简单) +不同路径(简单) +最小路径和 (中等) +最大子序和 (简单) +乘积最大子数组(中等) +买卖股票的最佳时机(简单) +买卖股票的最佳时机 II (简单) +买卖股票的最佳时机 III (困难) +买卖股票的最佳时机 IV (困难) +最佳买卖股票时机含冷冻期(中等) +买卖股票的最佳时机含手续费(中等) +零钱兑换 (中等) +零钱兑换 II (中等) +编辑距离(困难) +不同的子序列(困难) +柱状图中最大的矩形(困难) +最大矩形(困难) +最大正方形(中等) +最低票价(中等) +区域和检索 - 数组不可变(简单) +二维区域和检索 - 矩阵不可变(中等) +最长上升子序列 (中等) +鸡蛋掉落(困难) \ No newline at end of file