From 6a6858b2e84f65ba24c684a76359b83337ff2955 Mon Sep 17 00:00:00 2001 From: baici1 <249337001@qq.com> Date: Thu, 2 Sep 2021 15:44:01 +0800 Subject: [PATCH 001/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20347.=E5=89=8D=20K?= =?UTF-8?q?=20=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0=20go=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=A4=E4=B8=AA=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0347.前K个高频元素.md | 73 ++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/problems/0347.前K个高频元素.md b/problems/0347.前K个高频元素.md index 54be5cc4..6012e118 100644 --- a/problems/0347.前K个高频元素.md +++ b/problems/0347.前K个高频元素.md @@ -189,6 +189,79 @@ class Solution: Go: +```go +//方法一:小顶堆 +func topKFrequent(nums []int, k int) []int { + map_num:=map[int]int{} + //记录每个元素出现的次数 + for _,item:=range nums{ + map_num[item]++ + } + h:=&IHeap{} + heap.Init(h) + //所有元素入堆,堆的长度为k + for key,value:=range map_num{ + heap.Push(h,[2]int{key,value}) + if h.Len()>k{ + heap.Pop(h) + } + } + res:=make([]int,k) + //按顺序返回堆中的元素 + for i:=0;imap_num[ans[b]] + }) + return ans[:k] +} +``` + + + javaScript: ```js From 15e342e00b65b61bc3846f47b972fca01267bf4a Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+GHumorBS@users.noreply.github.com> Date: Thu, 2 Sep 2021 17:15:42 +0800 Subject: [PATCH 002/222] =?UTF-8?q?Update=200017.=E7=94=B5=E8=AF=9D?= =?UTF-8?q?=E5=8F=B7=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E7=BB=84=E5=90=88?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit self.s 语法纠正 --- problems/0017.电话号码的字母组合.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md index 1ebf6f49..dfd0e875 100644 --- a/problems/0017.电话号码的字母组合.md +++ b/problems/0017.电话号码的字母组合.md @@ -322,20 +322,20 @@ python3: ```py class Solution: def letterCombinations(self, digits: str) -> List[str]: - self.s = "" res = [] + s = "" letterMap = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"] - if len(digits) == 0: return res - def backtrack(digits,index): + if not len(digits): return res + def backtrack(digits,index, s): if index == len(digits): - return res.append(self.s) + return res.append(s) digit = int(digits[index]) #将index指向的数字转为int letters = letterMap[digit] #取数字对应的字符集 for i in range(len(letters)): - self.s += letters[i] - backtrack(digits,index + 1) #递归,注意index+1,一下层要处理下一个数字 - self.s = self.s[:-1] #回溯 - backtrack(digits,0) + s += letters[i] + backtrack(digits, index+1, s) #递归,注意index+1,一下层要处理下一个数字 + s = s[:-1] #回溯 + backtrack(digits, 0, s) return res ``` From bbd1b2e9ca58ae177f3d656752cd01a2ee15f7a2 Mon Sep 17 00:00:00 2001 From: ironartisan Date: Fri, 3 Sep 2021 17:19:26 +0800 Subject: [PATCH 003/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00102.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?= =?UTF-8?q?=E9=80=92=E5=BD=92=E8=A7=A3=E6=B3=95Python=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index a57a92aa..baec1229 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -88,6 +88,7 @@ public: python代码: ```python +# 迭代法 class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: if not root: @@ -108,7 +109,20 @@ class Solution: return out_list ``` - +```python +# 递归法 +class Solution: + def levelOrder(self, root: TreeNode) -> List[List[int]]: + res = [] + def helper(root, depth): + if not root: return [] + if len(res) == depth: res.append([]) # start the current depth + res[depth].append(root.val) # fulfil the current depth + if root.left: helper(root.left, depth + 1) # process child nodes for the next depth + if root.right: helper(root.right, depth + 1) + helper(root, 0) + return res +``` java: ```Java From b5c5ecf51f06b18009fe62a6450aca0cc63b0771 Mon Sep 17 00:00:00 2001 From: wjjiang <48505670+Spongecaptain@users.noreply.github.com> Date: Fri, 3 Sep 2021 19:30:02 +0800 Subject: [PATCH 004/222] =?UTF-8?q?Update=200503.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 go 版本 --- problems/0503.下一个更大元素II.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/problems/0503.下一个更大元素II.md b/problems/0503.下一个更大元素II.md index 4e088ed4..624c6c7c 100644 --- a/problems/0503.下一个更大元素II.md +++ b/problems/0503.下一个更大元素II.md @@ -132,6 +132,26 @@ class Solution: return dp ``` Go: +```go +func nextGreaterElements(nums []int) []int { + length := len(nums) + result := make([]int,length,length) + for i:=0;i0&&nums[i%length]>nums[stack[len(stack)-1]]{ + index := stack[len(stack)-1] + stack = stack[:len(stack)-1] // pop + result[index] = nums[i%length] + } + stack = append(stack,i%length) + } + return result +} +``` JavaScript: From bcd03971db853fdb17d6238b6851bd989ab613dd Mon Sep 17 00:00:00 2001 From: shuwen Date: Fri, 3 Sep 2021 22:04:27 +0800 Subject: [PATCH 005/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201002.=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6.md=20Python3=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8collections.Counter=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1002.查找常用字符.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/problems/1002.查找常用字符.md b/problems/1002.查找常用字符.md index c0ca578e..e02780da 100644 --- a/problems/1002.查找常用字符.md +++ b/problems/1002.查找常用字符.md @@ -193,6 +193,26 @@ class Solution: hash[i] -= 1 return result ``` + +Python 3 使用collections.Counter +```python +class Solution: + def commonChars(self, words: List[str]) -> List[str]: + tmp = collections.Counter(words[0]) + l = [] + for i in range(1,len(words)): + # 使用 & 取交集 + tmp = tmp & collections.Counter(words[i]) + + # 剩下的就是每个单词都出现的字符(键),个数(值) + for j in tmp: + v = tmp[j] + while(v): + l.append(j) + v -= 1 + return l +``` + javaScript ```js var commonChars = function (words) { From 659b34c22f171d011ce8b9e3a826954183c30315 Mon Sep 17 00:00:00 2001 From: ironartisan Date: Sat, 4 Sep 2021 15:06:39 +0800 Subject: [PATCH 006/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00222.=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=E8=BF=AD=E4=BB=A3=E8=A7=A3=E6=B3=95Java?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0222.完全二叉树的节点个数.md | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/problems/0222.完全二叉树的节点个数.md b/problems/0222.完全二叉树的节点个数.md index 6268c447..13017f7f 100644 --- a/problems/0222.完全二叉树的节点个数.md +++ b/problems/0222.完全二叉树的节点个数.md @@ -204,7 +204,27 @@ class Solution { } } ``` - +```java +class Solution { + // 迭代法 + public int countNodes(TreeNode root) { + if (root == null) return 0; + Queue queue = new LinkedList<>(); + queue.offer(root); + int result = 0; + while (!queue.isEmpty()) { + int size = queue.size(); + while (size -- > 0) { + TreeNode cur = queue.poll(); + result++; + if (cur.left != null) queue.offer(cur.left); + if (cur.right != null) queue.offer(cur.right); + } + } + return result; + } +} +``` ```java class Solution { /** From 8b9995cf26e951a61b4f37c9b48f0a362880c800 Mon Sep 17 00:00:00 2001 From: SCCCR <31815729+SCCCR@users.noreply.github.com> Date: Sat, 4 Sep 2021 16:17:25 +0800 Subject: [PATCH 007/222] =?UTF-8?q?Update=200300.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E4=B8=8A=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0300.最长上升子序列.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0300.最长上升子序列.md b/problems/0300.最长上升子序列.md index f9145f4c..fdd5fda8 100644 --- a/problems/0300.最长上升子序列.md +++ b/problems/0300.最长上升子序列.md @@ -39,7 +39,7 @@ 1. dp[i]的定义 -**dp[i]表示i之前包括i的最长上升子序列**。 +**dp[i]表示i之前包括i的最长上升子序列的长度**。 2. 状态转移方程 From b83cc1602a91c6d9ad3268904d17be42415d6938 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Sun, 5 Sep 2021 10:27:23 +0800 Subject: [PATCH 008/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00404.=E5=B7=A6?= =?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C.md=E5=B1=82=E5=BA=8F?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E8=A7=A3=E6=B3=95Java=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0404.左叶子之和.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index 2b627b6c..c0eb7c8e 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -201,7 +201,31 @@ class Solution { } } ``` - +```java +// 层序遍历迭代法 +class Solution { + public int sumOfLeftLeaves(TreeNode root) { + int sum = 0; + if (root == null) return 0; + Queue queue = new LinkedList<>(); + queue.offer(root); + while (!queue.isEmpty()) { + int size = queue.size(); + while (size -- > 0) { + TreeNode node = queue.poll(); + if (node.left != null) { // 左节点不为空 + queue.offer(node.left); + if (node.left.left == null && node.left.right == null){ // 左叶子节点 + sum += node.left.val; + } + } + if (node.right != null) queue.offer(node.right); + } + } + return sum; + } +} +``` ## Python From 81501d2acfb12c49821e6f3348b52e2e10cde1c7 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Sun, 5 Sep 2021 15:31:39 +0800 Subject: [PATCH 009/222] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=80=92=E5=BD=92?= =?UTF-8?q?=E7=AE=97=E6=B3=95=E7=9A=84=E6=97=B6=E9=97=B4=E4=B8=8E=E7=A9=BA?= =?UTF-8?q?=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90.md?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../前序/递归算法的时间与空间复杂度分析.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/前序/递归算法的时间与空间复杂度分析.md b/problems/前序/递归算法的时间与空间复杂度分析.md index 27b9d7cc..7a690781 100644 --- a/problems/前序/递归算法的时间与空间复杂度分析.md +++ b/problems/前序/递归算法的时间与空间复杂度分析.md @@ -166,7 +166,7 @@ void time_consumption() { system_clock::now().time_since_epoch() ); - fibonacci_3(0, 1, n); + fibonacci_3(1, 1, n); milliseconds end_time = duration_cast( system_clock::now().time_since_epoch() From ac71ac43bcc9437839d0da2fc4615eca6b34a31e Mon Sep 17 00:00:00 2001 From: hailincai Date: Sun, 5 Sep 2021 08:32:17 -0400 Subject: [PATCH 010/222] =?UTF-8?q?Update=200042.=E6=8E=A5=E9=9B=A8?= =?UTF-8?q?=E6=B0=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加Java 单调栈实现 --- problems/0042.接雨水.md | 47 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 522b10f9..17c671ef 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -391,6 +391,7 @@ class Solution { } } ``` + 动态规划法 ```java class Solution { @@ -418,6 +419,52 @@ class Solution { } } ``` + +单调栈法 +```java + public int trapMonoStack(int[] height){ + int size = height.length; + + if (size <= 2) return 0; + + // in the stack, we push the index of array + // using height[] to access the real height + Stack stack = new Stack(); + stack.push(0); + + int sum = 0; + for (int index = 1; index < size; index++){ + int stackTop = stack.peek(); + if (height[index] < height[stackTop]){ + stack.push(index); + }else if (height[index] == height[stackTop]){ + // 因为相等的相邻墙,左边一个是不可能存放雨水的,所以pop左边的index, push当前的index + stack.pop(); + stack.push(index); + }else{ + //pop up all lower value + int heightAtIdx = height[index]; + while (!stack.isEmpty() && (heightAtIdx > height[stackTop])){ + int mid = stack.pop(); + + if (!stack.isEmpty()){ + int left = stack.peek(); + + int h = Math.min(height[left], height[index]) - height[mid]; + int w = index - left - 1; + int hold = h * w; + if (hold > 0) sum += hold; + stackTop = stack.peek(); + } + } + stack.push(index); + } + } + + return sum; + } +``` + Python: 双指针法 From 8d1c4d65ffaf633ac3ffe17430bee6d7e5759829 Mon Sep 17 00:00:00 2001 From: hailincai Date: Sun, 5 Sep 2021 09:17:11 -0400 Subject: [PATCH 011/222] =?UTF-8?q?Update=200084.=E6=9F=B1=E7=8A=B6?= =?UTF-8?q?=E5=9B=BE=E4=B8=AD=E6=9C=80=E5=A4=A7=E7=9A=84=E7=9F=A9=E5=BD=A2?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加java 单调栈实现 --- problems/0084.柱状图中最大的矩形.md | 44 ++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/problems/0084.柱状图中最大的矩形.md b/problems/0084.柱状图中最大的矩形.md index a0f06e8f..57df4161 100644 --- a/problems/0084.柱状图中最大的矩形.md +++ b/problems/0084.柱状图中最大的矩形.md @@ -228,6 +228,50 @@ class Solution { } ``` +单调栈 +```java +class Solution { + int largestRectangleArea(int[] heights) { + Stack st = new Stack(); + + // 数组扩容,在头和尾各加入一个元素 + int [] newHeights = new int[heights.length + 2]; + newHeights[0] = 0; + newHeights[newHeights.length - 1] = 0; + for (int index = 0; index < heights.length; index++){ + newHeights[index + 1] = heights[index]; + } + + heights = newHeights; + + st.push(0); + int result = 0; + // 第一个元素已经入栈,从下表1开始 + for (int i = 1; i < heights.length; i++) { + // 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下表 + if (heights[i] > heights[st.peek()]) { + st.push(i); + } else if (heights[i] == heights[st.peek()]) { + st.pop(); // 这个可以加,可以不加,效果一样,思路不同 + st.push(i); + } else { + while (heights[i] < heights[st.peek()]) { // 注意是while + int mid = st.peek(); + st.pop(); + int left = st.peek(); + int right = i; + int w = right - left - 1; + int h = heights[mid]; + result = Math.max(result, w * h); + } + st.push(i); + } + } + return result; + } +} +``` + Python: 动态规划 From 69441475c6f5d037d1eff9a4fd46c4b1913f1ff9 Mon Sep 17 00:00:00 2001 From: hailincai Date: Sun, 5 Sep 2021 09:18:34 -0400 Subject: [PATCH 012/222] =?UTF-8?q?Update=200042.=E6=8E=A5=E9=9B=A8?= =?UTF-8?q?=E6=B0=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改代码格式 --- problems/0042.接雨水.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 17c671ef..4383a0b8 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -422,7 +422,8 @@ class Solution { 单调栈法 ```java - public int trapMonoStack(int[] height){ +class Solution { + public int trap(int[] height){ int size = height.length; if (size <= 2) return 0; @@ -463,6 +464,7 @@ class Solution { return sum; } +} ``` Python: From 429b504779d9981cd14329406ec9acbfd72cd76d Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Sun, 5 Sep 2021 21:38:56 +0800 Subject: [PATCH 013/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00257.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF=E5=BE=84?= =?UTF-8?q?.md=E8=BF=AD=E4=BB=A3=E6=B3=95Java=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0257.二叉树的所有路径.md | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index 2984427f..6386c48d 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -367,6 +367,43 @@ class Solution { } } ``` +```java +// 解法2 +class Solution { + /** + * 迭代法 + */ + public List binaryTreePaths(TreeNode root) { + List result = new ArrayList<>(); + if (root == null) + return result; + Stack stack = new Stack<>(); + // 节点和路径同时入栈 + stack.push(root); + stack.push(root.val + ""); + while (!stack.isEmpty()) { + // 节点和路径同时出栈 + String path = (String) stack.pop(); + TreeNode node = (TreeNode) stack.pop(); + // 若找到叶子节点 + if (node.left == null && node.right == null) { + result.add(path); + } + //右子节点不为空 + if (node.right != null) { + stack.push(node.right); + stack.push(path + "->" + node.right.val); + } + //左子节点不为空 + if (node.left != null) { + stack.push(node.left); + stack.push(path + "->" + node.left.val); + } + } + return result; + } +} +``` Python: ```Python From adafd3993154d5371edebd2406c880afd88d3b3b Mon Sep 17 00:00:00 2001 From: hailincai Date: Sun, 5 Sep 2021 09:44:53 -0400 Subject: [PATCH 014/222] =?UTF-8?q?Update=201356.=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E4=BA=8C=E8=BF=9B=E5=88=B6=E4=B8=8B1?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E7=9B=AE=E6=8E=92=E5=BA=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加Java实现 --- ...据数字二进制下1的数目排序.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/1356.根据数字二进制下1的数目排序.md b/problems/1356.根据数字二进制下1的数目排序.md index 660434a2..40a49b9c 100644 --- a/problems/1356.根据数字二进制下1的数目排序.md +++ b/problems/1356.根据数字二进制下1的数目排序.md @@ -123,6 +123,32 @@ public: ## Java ```java +class Solution { + private int cntInt(int val){ + int count = 0; + while(val > 0) { + val = val & (val - 1); + count ++; + } + + return count; + } + + public int[] sortByBits(int[] arr) { + return Arrays.stream(arr).boxed() + .sorted(new Comparator(){ + @Override + public int compare(Integer o1, Integer o2) { + // TODO Auto-generated method stub + int cnt1 = cntInt(o1); + int cnt2 = cntInt(o2); + return (cnt1 == cnt2) ? Integer.compare(o1, o2) : Integer.compare(cnt1, cnt2); + } + }) + .mapToInt(Integer::intValue) + .toArray(); + } +} ``` From d6f5a785871fc8918da32f1727e92021f9ccba23 Mon Sep 17 00:00:00 2001 From: hailincai Date: Sun, 5 Sep 2021 09:45:39 -0400 Subject: [PATCH 015/222] =?UTF-8?q?Update=201356.=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E4=BA=8C=E8=BF=9B=E5=88=B6=E4=B8=8B1?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E7=9B=AE=E6=8E=92=E5=BA=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit remove TODO for comparator --- problems/1356.根据数字二进制下1的数目排序.md | 1 - 1 file changed, 1 deletion(-) diff --git a/problems/1356.根据数字二进制下1的数目排序.md b/problems/1356.根据数字二进制下1的数目排序.md index 40a49b9c..06c29500 100644 --- a/problems/1356.根据数字二进制下1的数目排序.md +++ b/problems/1356.根据数字二进制下1的数目排序.md @@ -139,7 +139,6 @@ class Solution { .sorted(new Comparator(){ @Override public int compare(Integer o1, Integer o2) { - // TODO Auto-generated method stub int cnt1 = cntInt(o1); int cnt2 = cntInt(o2); return (cnt1 == cnt2) ? Integer.compare(o1, o2) : Integer.compare(cnt1, cnt2); From b2c6d5078acc1097b5faf6ab71ce2169589b2895 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 5 Sep 2021 23:19:48 +0800 Subject: [PATCH 016/222] Update --- problems/0377.组合总和Ⅳ.md | 19 ++++ problems/0416.分割等和子集.md | 38 +++----- .../0450.删除二叉搜索树中的节点.md | 25 ++--- problems/0474.一和零.md | 5 + problems/0494.目标和.md | 5 + problems/0509.斐波那契数.md | 2 +- problems/0518.零钱兑换II.md | 1 + problems/0669.修剪二叉搜索树.md | 34 +++---- .../0701.二叉搜索树中的插入操作.md | 35 ++++--- problems/回溯总结.md | 4 +- .../知识星球精选/HR面注意事项.md | 84 ++++++++++++++++ .../不少录友想放弃秋招.md | 75 +++++++++++++++ .../专业技能可以这么写.md | 61 ++++++++++++ .../关于实习大家的疑问.md | 83 ++++++++++++++++ .../关于提前批的一些建议.md | 68 +++++++++++++ .../写简历的一些问题.md | 95 +++++++++++++++++++ .../刷力扣用不用库函数.md | 29 ++++++ .../刷题攻略要刷两遍.md | 62 ++++++++++++ .../博士转行计算机.md | 47 +++++++++ .../知识星球精选/坚持的力量.md | 69 ++++++++++++++ .../知识星球精选/备战2022届秋招.md | 61 ++++++++++++ .../大厂新人培养体系.md | 76 +++++++++++++++ .../如何权衡实习与秋招复习.md | 43 +++++++++ problems/知识星球精选/客三消.md | 91 ++++++++++++++++++ .../技术不好如何选择技术方向.md | 28 ++++++ .../提前批已经开始了.md | 42 ++++++++ .../知识星球精选/秋招的上半场.md | 51 ++++++++++ .../秋招进行中的迷茫与焦虑.md | 50 ++++++++++ .../英语到底重不重要.md | 53 +++++++++++ .../知识星球精选/要不要考研.md | 40 ++++++++ .../面试中发散性问题.md | 40 ++++++++ 31 files changed, 1336 insertions(+), 80 deletions(-) create mode 100644 problems/知识星球精选/HR面注意事项.md create mode 100644 problems/知识星球精选/不少录友想放弃秋招.md create mode 100644 problems/知识星球精选/专业技能可以这么写.md create mode 100644 problems/知识星球精选/关于实习大家的疑问.md create mode 100644 problems/知识星球精选/关于提前批的一些建议.md create mode 100644 problems/知识星球精选/写简历的一些问题.md create mode 100644 problems/知识星球精选/刷力扣用不用库函数.md create mode 100644 problems/知识星球精选/刷题攻略要刷两遍.md create mode 100644 problems/知识星球精选/博士转行计算机.md create mode 100644 problems/知识星球精选/坚持的力量.md create mode 100644 problems/知识星球精选/备战2022届秋招.md create mode 100644 problems/知识星球精选/大厂新人培养体系.md create mode 100644 problems/知识星球精选/如何权衡实习与秋招复习.md create mode 100644 problems/知识星球精选/客三消.md create mode 100644 problems/知识星球精选/技术不好如何选择技术方向.md create mode 100644 problems/知识星球精选/提前批已经开始了.md create mode 100644 problems/知识星球精选/秋招的上半场.md create mode 100644 problems/知识星球精选/秋招进行中的迷茫与焦虑.md create mode 100644 problems/知识星球精选/英语到底重不重要.md create mode 100644 problems/知识星球精选/要不要考研.md create mode 100644 problems/知识星球精选/面试中发散性问题.md diff --git a/problems/0377.组合总和Ⅳ.md b/problems/0377.组合总和Ⅳ.md index f062a897..47e81af6 100644 --- a/problems/0377.组合总和Ⅳ.md +++ b/problems/0377.组合总和Ⅳ.md @@ -35,6 +35,8 @@ target = 4 ## 思路 +对完全背包还不了解的同学,可以看这篇:[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html) + 本题题目描述说是求组合,但又说是可以元素相同顺序不同的组合算两个组合,**其实就是求排列!** 弄清什么是组合,什么是排列很重要。 @@ -220,6 +222,23 @@ const combinationSum4 = (nums, target) => { }; ``` +Rust +```Rust +impl Solution { + pub fn combination_sum4(nums: Vec, target: i32) -> i32 { + let mut dp = vec![0; target as usize + 1]; + dp[0] = 1; + for i in 1..=target as usize { + for &j in nums.iter() { + if i as i32 >= j { + dp[i] += dp[i- j as usize]; + } + } + } + return dp[target as usize]; + } +} +``` ----------------------- diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index c8a5beea..599a3180 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -191,35 +191,23 @@ Java: ```Java class Solution { public boolean canPartition(int[] nums) { + if(nums == null || nums.length == 0) return false; + int n = nums.length; int sum = 0; - for (int i : nums) { - sum += i; + for(int num : nums){ + sum += num; } - if ((sum & 1) == 1) { - return false; - } - int length = nums.length; - int target = sum >> 1; - //dp[j]表示前i个元素可以找到相加等于j情况 - boolean[] dp = new boolean[target + 1]; - //对于第一个元素,只有当j=nums[0]时,才恰好填充满 - if (nums[0] <= target) { - dp[nums[0]] = true; - } - - for (int i = 1; i < length; i++) { - //j由右往左直到nums[i] - for (int j = target; j >= nums[i]; j--) { - //只有两种情况,要么放,要么不放 - //取其中的TRUE值 - dp[j] = dp[j] || dp[j - nums[i]]; - } - //一旦满足,结束,因为只需要找到一组值即可 - if (dp[target]) { - return dp[target]; + //总和为奇数,不能平分 + if(sum % 2 != 0) return false; + int target = sum / 2; + int[] dp = new int[target + 1]; + for(int i = 0; i < n; i++){ + for(int j = target; j >= nums[i]; j--){ + //物品 i 的重量是 nums[i],其价值也是 nums[i] + dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]); } } - return dp[target]; + return dp[target] == target; } } ``` diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index 0c8ea9ff..35c8e24d 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -9,7 +9,7 @@ > 二叉搜索树删除节点就涉及到结构调整了 -## 450.删除二叉搜索树中的节点 +# 450.删除二叉搜索树中的节点 [力扣题目链接]( https://leetcode-cn.com/problems/delete-node-in-a-bst/) @@ -25,7 +25,7 @@ ![450.删除二叉搜索树中的节点](https://img-blog.csdnimg.cn/20201020171048265.png) -## 思路 +# 思路 搜索树的节点删除要比节点增加复杂的多,有很多情况需要考虑,做好心里准备。 @@ -228,7 +228,7 @@ public: }; ``` -## 总结 +# 总结 读完本篇,大家会发现二叉搜索树删除节点比增加节点复杂的多。 @@ -246,10 +246,10 @@ public: 迭代法其实不太容易写出来,所以如果是初学者的话,彻底掌握第一种递归写法就够了。 -## 其他语言版本 +# 其他语言版本 -Java: +## Java ```java class Solution { public TreeNode deleteNode(TreeNode root, int key) { @@ -279,14 +279,9 @@ class Solution { } ``` -Python: +## Python + ```python -# Definition for a binary tree node. -# class TreeNode: -# def __init__(self, val=0, left=None, right=None): -# self.val = val -# self.left = left -# self.right = right class Solution: def deleteNode(self, root: TreeNode, key: int) -> TreeNode: if not root: return root #第一种情况:没找到删除的节点,遍历到空节点直接返回了 @@ -318,7 +313,7 @@ class Solution: return root ``` -Go: +## Go ```Go // 递归版本 func deleteNode(root *TreeNode, key int) *TreeNode { @@ -404,9 +399,9 @@ func deleteNode(root *TreeNode, key int) *TreeNode { } ``` -JavaScript版本 +## JavaScript -> 递归 +递归 ```javascript /** diff --git a/problems/0474.一和零.md b/problems/0474.一和零.md index 48dae287..e3b05704 100644 --- a/problems/0474.一和零.md +++ b/problems/0474.一和零.md @@ -39,6 +39,11 @@ ## 思路 +如果对背包问题不都熟悉先看这两篇: + +* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) +* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) + 这道题目,还是比较难的,也有点像程序员自己给自己出个脑筋急转弯,程序员何苦为难程序员呢哈哈。 来说题,本题不少同学会认为是多重背包,一些题解也是这么写的。 diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 342c229d..4993bede 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -39,6 +39,11 @@ ## 思路 +如果对背包问题不都熟悉先看这两篇: + +* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) +* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) + 如果跟着「代码随想录」一起学过[回溯算法系列](https://programmercarl.com/回溯总结.html)的录友,看到这道题,应该有一种直觉,就是感觉好像回溯法可以爆搜出来。 事实确实如此,下面我也会给出相应的代码,只不过会超时,哈哈。 diff --git a/problems/0509.斐波那契数.md b/problems/0509.斐波那契数.md index 293e2323..7e4df26c 100644 --- a/problems/0509.斐波那契数.md +++ b/problems/0509.斐波那契数.md @@ -167,7 +167,7 @@ public: -## 其他语言版本 +# 其他语言版本 Java: diff --git a/problems/0518.零钱兑换II.md b/problems/0518.零钱兑换II.md index fda3621b..6eb31cd8 100644 --- a/problems/0518.零钱兑换II.md +++ b/problems/0518.零钱兑换II.md @@ -46,6 +46,7 @@ 这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。 + 对完全背包还不了解的同学,可以看这篇:[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html) 但本题和纯完全背包不一样,**纯完全背包是能否凑成总金额,而本题是要求凑成总金额的个数!** diff --git a/problems/0669.修剪二叉搜索树.md b/problems/0669.修剪二叉搜索树.md index fe18e5a5..ef6a3e00 100644 --- a/problems/0669.修剪二叉搜索树.md +++ b/problems/0669.修剪二叉搜索树.md @@ -10,7 +10,7 @@ > 如果不对递归有深刻的理解,本题有点难 > 单纯移除一个节点那还不够,要修剪! -## 669. 修剪二叉搜索树 +# 669. 修剪二叉搜索树 [力扣题目链接](https://leetcode-cn.com/problems/trim-a-binary-search-tree/) @@ -20,7 +20,7 @@ ![669.修剪二叉搜索树1](https://img-blog.csdnimg.cn/20201014173219142.png) -## 思路 +# 思路 相信看到这道题目大家都感觉是一道简单题(事实上leetcode上也标明是简单)。 @@ -228,7 +228,7 @@ public: }; ``` -## 总结 +# 总结 修剪二叉搜索树其实并不难,但在递归法中大家可看出我费了很大的功夫来讲解如何删除节点的,这个思路其实是比较绕的。 @@ -238,10 +238,10 @@ public: 本题我依然给出递归法和迭代法,初学者掌握递归就可以了,如果想进一步学习,就把迭代法也写一写。 -## 其他语言版本 +# 其他语言版本 -Java: +## Java ```Java class Solution { @@ -264,16 +264,10 @@ class Solution { ``` -Python: +## Python ```python3 -# Definition for a binary tree node. -# class TreeNode: -# def __init__(self, val=0, left=None, right=None): -# self.val = val -# self.left = left -# self.right = right class Solution: def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode: if not root: return root @@ -285,17 +279,11 @@ class Solution: root.right = self.trimBST(root.right,low,high) // root->right接入符合条件的右孩子 return root ``` -Go: + +## Go + ```go -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ // 递归 func trimBST(root *TreeNode, low int, high int) *TreeNode { if root==nil{ @@ -313,6 +301,7 @@ func trimBST(root *TreeNode, low int, high int) *TreeNode { root.Right=trimBST(root.Right,low,high) return root } + // 迭代 func trimBST(root *TreeNode, low int, high int) *TreeNode { if root == nil { @@ -347,7 +336,8 @@ func trimBST(root *TreeNode, low int, high int) *TreeNode { ``` -JavaScript版本: +## JavaScript版本 + 迭代: ```js var trimBST = function(root, low, high) { diff --git a/problems/0701.二叉搜索树中的插入操作.md b/problems/0701.二叉搜索树中的插入操作.md index c245ddcf..d5b9eb3f 100644 --- a/problems/0701.二叉搜索树中的插入操作.md +++ b/problems/0701.二叉搜索树中的插入操作.md @@ -7,7 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 701.二叉搜索树中的插入操作 +# 701.二叉搜索树中的插入操作 [力扣题目链接](https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/) @@ -24,7 +24,7 @@ * -10^8 <= val <= 10^8 * 新值和原始二叉搜索树中的任意节点值都不同 -## 思路 +# 思路 其实这道题目其实是一道简单题目,**但是题目中的提示:有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人**,瞬间感觉题目复杂了很多。 @@ -195,7 +195,7 @@ public: }; ``` -## 总结 +# 总结 首先在二叉搜索树中的插入操作,大家不用恐惧其重构搜索树,其实根本不用重构。 @@ -204,9 +204,10 @@ public: 最后依然给出了迭代的方法,迭代的方法就需要记录当前遍历节点的父节点了,这个和没有返回值的递归函数实现的代码逻辑是一样的。 -## 其他语言版本 +# 其他语言版本 + +## Java -Java: ```java class Solution { public TreeNode insertIntoBST(TreeNode root, int val) { @@ -253,7 +254,7 @@ class Solution { } ``` -Python: +## Python **递归法** - 有返回值 @@ -267,7 +268,8 @@ class Solution: if root.val > val: root.left = self.insertIntoBST(root.left, val) # 递归创建左子树 return root -``` +``` + **递归法** - 无返回值 ```python class Solution: @@ -294,7 +296,8 @@ class Solution: return __traverse(root, val) return root -``` +``` + **迭代法** 与无返回值的递归函数的思路大体一致 ```python @@ -326,7 +329,7 @@ class Solution: ``` -Go: +## Go 递归法 @@ -343,8 +346,10 @@ func insertIntoBST(root *TreeNode, val int) *TreeNode { } return root } -``` -迭代法 +``` + +迭代法 + ```go func insertIntoBST(root *TreeNode, val int) *TreeNode { if root == nil { @@ -370,9 +375,9 @@ func insertIntoBST(root *TreeNode, val int) *TreeNode { } ``` -JavaScript版本 +## JavaScript -> 有返回值的递归写法 +有返回值的递归写法 ```javascript /** @@ -404,7 +409,7 @@ var insertIntoBST = function (root, val) { }; ``` -> 无返回值的递归 +无返回值的递归 ```javascript /** @@ -444,7 +449,7 @@ var insertIntoBST = function (root, val) { }; ``` -> 迭代 +迭代 ```javascript /** diff --git a/problems/回溯总结.md b/problems/回溯总结.md index f4578c83..5a9725dd 100644 --- a/problems/回溯总结.md +++ b/problems/回溯总结.md @@ -382,7 +382,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以下在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。 子集问题分析: -* 时间复杂度:O(n * 2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2^n),构造每一组子集都需要填进数组,又有需要O(n),最终时间复杂度:O(n * 2^n) +* 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2^n) * 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n) 排列问题分析: @@ -390,7 +390,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 * 空间复杂度:O(n),和子集问题同理。 组合问题分析: -* 时间复杂度:O(n * 2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 +* 时间复杂度:O(2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 * 空间复杂度:O(n),和子集问题同理。 N皇后问题分析: diff --git a/problems/知识星球精选/HR面注意事项.md b/problems/知识星球精选/HR面注意事项.md new file mode 100644 index 00000000..5e0e9d65 --- /dev/null +++ b/problems/知识星球精选/HR面注意事项.md @@ -0,0 +1,84 @@ + +# HR面注意事项 + +[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里已经有一些录友开始准备HR面。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210807155107.png) + +甚至星球里已经有录友拿到百度提前批的offer + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210808102821.png) + +看到一些录友面试这么顺利还是非常开心的,同时我也在知识星球里分享了HR面最容易遇到的 问题,已经应该如何回答。 + +相信公众号里不少录友也会遇到同样的问题,所以就给大家再分享一下。 + +HR面的话,如果不犯重大问题,一般不会刷人。 + +但有些同学也会犯重大问题,这样丢了offer,可就太可惜了。 + +**HR的职责是选择符合公司文化价值观的员工**,那么说到文化价值观,大家可能感觉 这虚无缥缈的,怎么能证明自己符合文化价值观呢。 + +其实HR主要从如下几个问题来考察,大家只要把这几个问题想清楚,就差不多了。 + + +## 为什么选择我们公司? + +这个大家一定要有所准备,不能被问到了之后一脸茫然,然后说 “就是想找个工作”,那基本就没戏了 + +要从**技术氛围,职业发展,公司潜力**等等方面来说自己为什么选择这家公司。 + +要表现自己如何如何看好这家公司,期待和这家公司一起成长。 + +## 有没有职业规划? + +一般应届生都没有明确的职业规划,不过当HR问起来的时候,不要说 自己想工作几年想做项目经理,工作几年想做产品经理,甚至想当leader带团队,这样会被HR认为 职业规划不清晰,尽量从技术的角度规划自己。 + +这个策略同样适用于社招。 + +虽然大部分程序员的终极目标都想做leader,或者做管理,(极少数想要写一辈子代码的大牛除外,不过国内环境对这种大牛并不友好) + +大家都想做战略做规划,那比写代码有意思,有成就感多了。 + +但不要说出来,一定要围绕技术这块来规划,根据你的岗位,**一年 技术达到什么程度,三年在某个技术领域有深入研究,五年成为技术专家之类的**等等。 + +这块其实我和HR朋友还真的讨论过,我说:就大厂,百分之九十五以上的程序员都不想写代码,以后指定是想转产品或者升leader做项目管理, 但你为什么还要问这么 无聊的问题呢。 + +HR朋友的回答是:你不说真相,我会认为你可能对技术有追求,但如果你说出真相,那么明确你对技术没有追求。 + +所以,即使你有其他想法,在职业规划HR面的时候,**也要仅仅围绕技术,树立自己要深耕技术的形象**。 + +## 是否接受加班? + +虽然大家都不喜欢加班,但是这个问题,我还是建议如果手头没有offer的话,大家尽量选择接受了吧 + +就说:自己可以介绍 XX程度的加班。 + +如果确实身体不适,那就直接拒绝,毕竟健康是第一位。 + +## 坚持最长的一件事情是什么? + +这个问题,大家最好之前就想好,有一些同学可能印象里自己没有坚持很长的事情,也没有好好想过这个问题,在HR面的时候被问到的时候,一脸茫然,不知道该说啥。 + +憋了半天说出一个不痛不痒的事情。这就是一个减分项了! + +问这个问题主要是考察大家的韧性,会不会做一个件事遇到困难就中途放弃了。 + +星球里的录友可以说自己坚持每日打卡总结,这也是可以的,毕竟这种需要自己克制才能做到的事情。 + +## 如果校招,直接会问:期望薪资XXX是否接受? + +这里大家如果感觉自己表现的很好 给面试官留下的很好的印象,**可以在这里争取 special offer** + +这都是可以的,但是要真的对自己信心十足。 + +## 如果社招,则会了解前一家目前公司薪水多少 ? + +**这里大家切记不要虚报工资,因为入职前是要查流水的,也就是要把上一件公司的银行流水截图报上来,这个是比较严肃的问题。** + + +好了,说了这么多,希望对大家有所帮助。 + +--------------- + +加入「代码随想录」知识星球,[点击这里](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) diff --git a/problems/知识星球精选/不少录友想放弃秋招.md b/problems/知识星球精选/不少录友想放弃秋招.md new file mode 100644 index 00000000..37fd0d3d --- /dev/null +++ b/problems/知识星球精选/不少录友想放弃秋招.md @@ -0,0 +1,75 @@ + +马上就要九月份了,互联网大厂的秋招的序幕早已拉开。 + +发现[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有一部分录友想放弃秋招,直接准备明年的春招,估计关注公众号的录友也有不少有这种想法的。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210813103515.png) + +一般有这种想法的录友都是 **之前没有准备好,或者是总感觉时间赶趟赶趟,然后突然间 发现时间不赶趟了。。。** + +也有一些感觉自己没有实习经历,简历上也没什么好写,想下半年去找一找实习,不去秋招,然后直接准备春招。 + +**对于这种情况,我的建议依然要冲刺秋招!** + +# 把秋招当做最后的机会 + +**等到春招的时候,可以选岗位已经很少了,各个大厂几乎都招满了**。 + +而且就算秋招没找到好工作,一般 11月份左右,一些大厂还会有补招,腾讯就经常补招。 + +补招的情况是就是腾讯发出了 offer,有的候选人 选择违约,不来了,那么腾讯就需要补招,把人数凑齐。 + +可能有录友想,谁居然连腾讯的offer都拒绝呢? + +其实挺多的,例如:有其他大厂的核心部门offer,父母给安排了 国企、央企 的核心岗位,或者有的选择 读博了之类的,导师毕业能给安排留校 或者去其他高校任教。 + +所以几乎每年,腾讯都要补招,其他大厂也会有补招,一般是11月份,所以就算秋招没拿到大厂offer,依然有机会! + +话再说回来,面试其实也很看缘分,**永远没有真正准备好的时候,知识一直都学不完**。 + +所以 **把秋招当做最后的机会,就算秋招没找到,也可以在冲春招,而不是 直接放弃秋招**。 + + +# 放弃秋招,对心态的影响 + +如果直接放弃秋招,等 今年 10月份,身边同学都找到工作了,那时候的场面就是歌舞升平,大家天天吃喝玩乐。 + +见面打会招呼就问:你去哪了,你签哪了? + +那时候如果自己还没有面试,还在准备面试,此时自己心里阴影面积有多大,甚至会影响春招找工作。 + +# 面试要趁早准备 + +每年这时候,都会有同学后悔,我怎么就没早点准备,就感觉时间不够用。 + +所以也给明年找工作的录友们(2023届)提一个醒,现在就要系统性的准备起来了,因为明年春季实习招聘 是一个很好的进大厂的机会,剩下的时间也不是很多了。 + +来看看[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,一位准大三的录友准备的情况 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/星球大三.jpg) + +再来看看一位准大二的录友准备情况 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/星球大二.jpg) + +**我已经预感到 这两位 等到秋招的时候就是稳稳的offer收割机**。 + +[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)还有很多已经开始提前准备,或者看了 星球发文状态就开始着手准备的录友了。 + + +所以 **所谓的大牛,都是 很早就规划自己要学的东西,很早就开始向过来人请教应该如何找工作,很早就知道自己应该学哪些技术,看哪些书, 这样等到找工作的时候,才是剑锋出鞘的时候**。 + +我们远远还没有到拼智商的程度。 + +这里 也是给公众号里的录友们提一个醒,估计还有不少录友依然在感觉时间还赶趟,但 未来的卷王已经在路上了 哈哈哈。 + +**不过话说回来,现在互联网求职确实卷!** + +但这是社会问题,我们改变不了。 + +**卷的核心是,好的东西少,但要想的人多!** + +**如果你也想要,就要提前准备,提前规划,提前努力!** + +也希望录友们都能找到一个自己心仪的工作,加油💪。 + diff --git a/problems/知识星球精选/专业技能可以这么写.md b/problems/知识星球精选/专业技能可以这么写.md new file mode 100644 index 00000000..cf7cdff7 --- /dev/null +++ b/problems/知识星球精选/专业技能可以这么写.md @@ -0,0 +1,61 @@ + + +其实我几乎每天都要看一些简历,有一些写的不错的,我都会在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里分享一下。 +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626172902.png) + +这次呢,我再专门说一说简历中的【专业技能】这一栏应该怎么写。 + +很多同学【专业技能】这块写的很少,其实不是掌握的少,而是没有表达出来。 + +例如有的同学这么写: + + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626173915.png) + +--------------------- + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626173940.png) + +-------------------- + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626174018.png) + +------------------- + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626174809.png) + + +这些【专业技能】都写的很少,其实是可以在丰富一些的。 + +我来给大家拓展一下、 + + +* 熟练C++,(列举C++的若干知识点),了解 Java,python,go (适当补充对这些语言的理解) +* 熟悉常见设计模式(例句一些设计模式) +* 熟悉linux操作系统vim开发环境,(列举网络编程相关知识,例如epoll,socket等等) +* 熟悉网络,(列举网络协议相关考点,tcp/ip,http, https, 三次,四次握手,流量控制等等) +* 数量掌握数据结构与算法(列举常用算法,最好搞透一个算法,说对该算法有独到见解) +* 数量使用Git,等版本控制 +* 以上为公共写法,下面可以在补充自己的其他领域的内容 + + +针对以上这个模板, 再来补充相关内容: + +1. 熟悉C/C++,熟练使用C的指针应用及内存管理,C++的封装继承多态,STL常用容器,C++11常用特性(智能指针等) ,了解 Python,Gtest等。 +2. 熟悉常用设计模式(单例模式,工厂模式等) +3. 熟悉Linux下vim开发环境,了解网络编程,IO多路复用,epoll等等。 +4. 熟悉OSI五层网络模型,熟悉TCP/IP,UDP,HTTP/HTTPS,DNS等网络协议,熟悉TCP三次握手,四次挥手,流量控制,拥塞控制等手段。 +5. 熟悉常用的数据结构(链表、栈、队列、二叉树等),熟练使用排序,贪心,动态规划等算法。 +6. 熟悉使用Git,vscode工具使用。 + +但需要注意的是,这里写的点,自己一定要熟练掌握,因为简历上写的,面试官一定会问。 + +这样有一个好处,就是 **缩小面试官的问题范围**, 只要简历上写的,你都准备好了,那么简历上的知识点面试官一定会问,这样你就掌握了主动权。 + +举一个例子,如果简历上直写:熟悉C++。其他都没介绍,那么面试官指定围绕C++漫天遍野的问起来了,你也猜不透面试官想问啥。 + +如果简历写熟悉C/C++,熟练使用C的指针应用及内存管理,C++的封装继承多态,STL常用容器,C++11常用特性(智能指针等)。那么面试官基本上只会问,内存管理,多态,STL和C++11的一些特性, **这样你就把面试官的问题都圈在可控范围内**,从而掌握主动权! + +这一点很重要,希望大家要有这个思路,去写自己的简历。 + + diff --git a/problems/知识星球精选/关于实习大家的疑问.md b/problems/知识星球精选/关于实习大家的疑问.md new file mode 100644 index 00000000..118d8bf1 --- /dev/null +++ b/problems/知识星球精选/关于实习大家的疑问.md @@ -0,0 +1,83 @@ + +# 关于实习,大家可能有点迷茫! + +我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里回答了很多关于实习相关的问题,其实很多录友可能都有这么样的疑问,主要关于实习的问题有如下四点: + +* 秋招什么时候开始准备 +* 要不要准备实习 +* 实习是不是重要? +* 什么时候找实习最有帮助 +* 如何选择实习的offer + +下面都分别来说一说: + +## 秋招什么时候开始准备 + +![实习二](https://img-blog.csdnimg.cn/20210502145513517.png) + +**准备工作指定是越早越好的**。 + +准备的越早,在8,9月份就越淡定,每年校招很多同学都会对于准备找工作总感觉赶趟赶趟,结果到了8月份开始慌得一笔了。 + +正常校招8月份就开始提前批(各大企业提前抢优秀毕业生)了,有的企业甚至7月份就开始。 + +基本到了7月份可能就没有整块的时间静下心来准备找工作,那时候已经铺天盖地的各种招聘信息,甚至一些同学已经拿到了offer了。 + +所以准备找工作的内容以7月为终结点比较稳妥,七月份之后以复习为主,有个整体框架,定时复习补充补充,多和同学交流面试经验。 + +## 要不要准备实习 + +有的同学是3,4月份准备面实习,然后7、8月份就去企业实习了,**实习有利有弊**。 + +如果可以去一线互联网公司实习,而且岗位也合适,那当然要去,如果去不了也别难过,因为实习生大部分都是打杂,干的活甚至都写不到简历上。 + +也有一小部分的实习生能够真正做到项目。 + +如果没有去实习,就把基础好好补充一下,**基础打好,毕竟对于应届生基础最为重要**, 编程语言、数据结构算法、计算机网络、操作系统、数据库这些都是基础,规划好时间把这些内容学好。 + +**对于应届生来说,项目经历是锦上添花,不是决定性的**。 + +有实习经历(前提是实习工作内容是真正的做项目,不是打杂),那么面试的时候面试官可能对项目经历感兴趣,问基础的内容就比较少, 如果没有实习经历,就把基础内容巩固一下,校招是一样的。 + +## 实习是不是非常重要? + +![实习一](https://img-blog.csdnimg.cn/20210502114600147.png) + +**大厂的实习经历对秋招还是很有帮助的**。 + + +但也不绝对,实习的话会耽误三个月左右,如果没有转正,而且一直在打杂的话,再去找秋招工作,**那时候一些基础的内容就都忘光了,反而秋招很被动**。 + +现在当然也可以按照准备找实习的状态来要求自己,给自己点压力,毕竟找实习准备的知识和秋招准备的知识差不多。 + +也可以提前经历一下面试,培养一下面试感觉,数据库方面知识你比较短缺,可以通过大量看这方面的面经迅速补充一下(秋招之前还可以系统看一看)。 + +如果拿到了大厂的实习offer,就去吧,实习的时候心里要有个秤,如果工作是打杂,就要尽快自己抽时间看基础准备秋招。 + +**另外需要注意的是,有些公司投递过简历面试没通过是有记录的,所以投递要当心,不要感觉投简历没有成本**,我知道的例如阿里,你每次投简历都有记录,如果实习面试都挂了,秋招的时候面试官也会看当时实习面试的记录(会考虑当时实习面试的结果)。 + +## 什么时候找实习最有帮助 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210502151249354.png) + +6月份那时候基本不招实习生了,找的话也是日常实习(没有转正,实习时间是比较长的,要六个月),如果不是暑期实习就直接准备秋招吧。 + +**只有应届的暑期实习才有转正的机会,因为企业这样安排也是为了提前发现优秀毕业生!** + +例如:今年暑期实习,只招明年毕业的应届生。 + + +## 如何选择实习的offer + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210502152023574.png) + +如果目标应该是C++后端开发,那客户端实习offer可以选择别去了。 或者 选一个实习时间最短的offer先去着,例如两个月之类的,这样既能体现一下工作流程,也别耽误太多时间(毕竟客户端开发不是你的目标)。 + +**实习也不是必要的,一要看实习的岗位,是不是你想要的工作,二是实习的内容是不是打杂**,一些实习岗位其实是在浪费时间,如果转正不了的话,秋招就特别被动了,耽误了复习基础的时间。 + +还有就是**秋招的时候,一定要找小公司先练手,然后在面大公司**。 + + +以上基本覆盖了大家对实习的各种疑惑,不过现在已经到了5月份,实习面试基本结束了,如果没有拿到实习offer,大家安心准备秋招吧,依然可以冲刺大厂! + + diff --git a/problems/知识星球精选/关于提前批的一些建议.md b/problems/知识星球精选/关于提前批的一些建议.md new file mode 100644 index 00000000..fcf41a7e --- /dev/null +++ b/problems/知识星球精选/关于提前批的一些建议.md @@ -0,0 +1,68 @@ + +# 秋招和提前批都越来越提前了.... + +正在准备秋招的录友,可能都感受到了,现在的秋招越来越提前了.... + +以前提前批,都是 8月份,8月份中序左右,而不少大厂现在就已经提前批了。 + +不少录友在 公众号留言,和[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,表示提前批来的还是有点快。 + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210618162214.png) + +还没有把刷题攻略刷完的录友,要尽快刷完,至少先刷一遍,了解相关题型。 + +星球里,也有一些录友感受到了提前批的突如其来。 + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210619190111.png) + +目前已经开始的提前批有 vivo, tp-link,京东,百度..... + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210619190022.png) + + +有的录友已经明显紧张起来了。 + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210619190354.png) + +其实这才刚刚开始,等 7月份 以后,又是铺天盖地的信息,大家更没心情静下心来看书了。 + + +# 关于提前批的一点小建议 + +**首先我们要知道为什么有提前批?** + +提前批不是大厂们呆着没事闲着多给我们一次面试机会,**而是提前抢优秀毕业生**,这一点大家一定要明确。 + + +了解了为什么有提前批,这样我们就有正确的心态面对它了。 + +如果没有准备好,或者自己定位因为不是 “优秀毕业生”,先不要碰提前提。 + +当然可以先面一些自己不想去的公司的提前批,用来练手。 + +至于对于自己心仪的公司,如果盲目参加提前批,首先会打乱自己的复习计划,和心态,然后就是提前批挂了后台都是有记录的。 + +只要是大厂的内部信息化做的比较完善,提前批挂了,是一定会记录的。 + +**那么提前批有没有影响呢?** + +很多招聘宣传的时候说,提前批挂了对秋招没影响,确实在一定程度上没影响,因为提前批挂了,依然可以投递秋招。 + +然后秋招面试的时候,面试官在不在意你的提前批成绩,就是另一回事了。 + +我之前内推了一些录友面试腾讯微信支付的部门,面试官和我很熟悉,我最近还和他吃了饭,聊一聊我内推的同学,他说看后台记录有些同学都投过好几次了,他看了之前面试结果的评价之后,就直接pass了。 + +所以大家可能要想好一个回答,就是面试官可能问:你的提前批为什么挂了? + +而且提前批挂了,都是有当时面试官评语的,如果7月份提前批面试,面试官评价:这位候选人基础不行。 + +秋招的时候,面试官也不会相信,一两个月能把基础补上来了。 即使你的基础其实没问题,只不过恰巧面试中的几个问题没答好而已。 + + +对于技术能力确实强的同学,我建议全力以赴准备提前批面试,因为提前批要求就比较高,很容易谈sp offer。而且现在就拿到了大厂offer,比找实习还香。 + +如果没准备好的同学,建议不要让提前批打乱阵脚,有计划的巩固基础,准备秋招。或者先拿自己不想去的公司的提前批练手。 + + +好了,说了这么多,希望对录友们有所帮助,加油💪 + diff --git a/problems/知识星球精选/写简历的一些问题.md b/problems/知识星球精选/写简历的一些问题.md new file mode 100644 index 00000000..2ebfbe51 --- /dev/null +++ b/problems/知识星球精选/写简历的一些问题.md @@ -0,0 +1,95 @@ + + +自运营[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 + +社招,校招,实习的都有,其实大家的简历看多了,发现有很多共性的问题,这里就和大家分享一下。 + +我的简历模板也分享出来了,大家在「代码随想录」后台回复:简历模板,就可以获取! + +# 简历布局 + +不少录友的简历布局就很不合理, 有的把专业技能放在最下面了,有的甚至把教育经历放下面了,建议简历布局的顺序是这样: + +* 教育工作经历 +* 专业技能 +* 项目经验 +* 荣誉奖项 +* 个人简述 + +# 教育工作经历 + +一些录友可能本科学历不是很好,然后 简历上直接不写自己的本科学校。 + +其实教育经历是最基本的,你不写 面试官也一定会问,问出来 那么感觉更不好,所以关于教育经历,大家是一定要写的。 + +写本科以后教育经历的就行了,一些录友可能是 高中就读了一些特别牛逼的高中,然后把高中也写出来了,哈哈哈,高中经历真的就不用写了。 + +还有一些社招的录友,研究生和本科之间空了几年,这几年 一定要说清楚做了些什么,甚至是“编一下”,因为这个面试官也会问的。 + +# 专业技能 + +一些录友简历上没有「专业技能」这一栏,或者写的很短。 + +可能是不知道该写啥,甚至就不写了。 + +通常「专业技能」是在 「教育工作经历」之后的,我这里给出一个模板,大家按照这个格式来写「专业技能」就可以。 + +1. 熟练使用 C++,掌握Go,了解 Java、Python、PHP 等编程语言 +2. 熟练使用 linux 下 vim、Git 开发环境 +3. 了解 Linux 下网络编程、TCP/IP 协议 +4. 掌握基础数据结构和算法的基本原理 +5. 英语六级:XXX + + +一些录友会列举自己主修的课程,列了一堆,其实凑篇幅 我是理解的,就是感觉简历太单薄的,列课程来凑。 + +但大家凑篇幅 尽力在「专业技能」和「项目经验」上凑篇幅,如果把 自己主修可能都列出来,会让面试官感觉没有什么干货。(有的同学甚至靠留白才凑篇幅,这就更不要了) + +当然应届生如果有一些课程自己成绩确实很好,可以和「教育经历」写在一起,简单并行列举一下就可以了。 + +# 项目经验 + +很多录友写项目经验就是流水账,这是什么项目,自己完成了功能1,2,3,4。堆了很多字。 + +要知道面试官是不了解你的项目的,面试也只有 一个小时左右的时间,如果堆了很多文字 面试官也懒得去读。 + +面试官最在意的是什么呢? + +**项目中有哪些技术难点,以及 你是如何克服的**。 + +这是面试官最关心的,也是最能体现出候选人技术深度的问题。 + +所以大家在描述项目经验的时候,一定要时刻想着,这个项目的难点究竟是什么,要反复问自己这个问题。 + +可能有的同学说了,我这项目本来就没有难点啊,就是1,2,3,4功能,然后 遇到不会的,百度搜一下,差不多就这样了。 + +**项目没有难点,也要自己“造难点”**。 因为这个问题是面试官必问的! + +所以一定要准备好。 + +还有不少录友的项目经历都写了 web server,使用线程池 + 非阻塞 socket + epoll(ET 和 LT) + 事件处理 (Reactor 和模拟 Proactor) 等等。 + +这个项目可能是很多准备后台开发的同学 首选的 项目。 + +这种自己搞的小项目,**最好把你的代码上传的github上,然后在简历中贴出github地址**,面试官一定会看的。 + +如果看你的代码写的确实不错,那指定是加分项。比简历上写的天花乱坠都强! + +还有的同学项目经历特别多,写了5,6个项目,每个项目都是概述了一下自己做了XXX。 + +其实面试官,基本就会和你深入聊 2个的项目左右,列举这么多项目没有用的,关键这些项目一看也是技术含量不大。 + +**所以不用单纯堆项目个数。项目经历 两个足够,把两个项目搞深搞透** + + +# 校园经历 + +一些录友会把自己学校工作列出一大堆,例如各种学生会啊,创新部门啊之类的。甚至有的会把自己的减肥经历也列举出来。 + +如果面技术岗位,这一块其实不是面试官关心的,可以在 最后一栏「个人简述」,简单一两句概括一下自己的学生会经历就好,表明自己沟通能力没问题。 + +关于标明自己有毅力,有恒心,不怕吃苦等等,都简单一句概括。 + + +好了,关于简历的问题,我就先分享这些,估计应该击中了不少录友的痛点了。 + diff --git a/problems/知识星球精选/刷力扣用不用库函数.md b/problems/知识星球精选/刷力扣用不用库函数.md new file mode 100644 index 00000000..1a613b8d --- /dev/null +++ b/problems/知识星球精选/刷力扣用不用库函数.md @@ -0,0 +1,29 @@ +# 究竟什么时候用库函数,什么时候要自己实现 + +在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有录友问我,刷题究竟要不要用库函数? 刷题的时候总是禁不住库函数的诱惑,如果都不用库函数一些题目做起来还很麻烦。 + +估计不少录友都有这个困惑,我来说一说对于库函数的使用。 + +一些同学可能比较喜欢看力扣上直接调用库函数的评论和题解,**其实我感觉娱乐一下还是可以的,但千万别当真,别沉迷!** + +例如:[字符串:151. 翻转字符串里的单词](https://mp.weixin.qq.com/s/X3qpi2v5RSp08mO-W5Vicw)这道题目本身是综合考察同学们对字符串的处理能力,如果 split + reverse的话,那就失去了题目的意义了。 + +有的同学可能不屑于实现这么简单的功能,直接调库函数完事,把字符串分成一个个单词,一想就是那么一回事,多简单。 + +相信我,很多面试题都是一想很简单,实现起来一堆问题。 所以刷力扣本来就是为面试,也为了提高自己的代码能力,扎实一点没坏处。 + +**那么平时写算法题目就全都不用库函数了么?** + +当然也不是,这里我给大家提供一个标准。 + +**如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数**。 + +**如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,那么直接用库函数。** + +使用库函数最大的忌讳就是不知道这个库函数怎么实现的,也不知道其时间复杂度,上来就用,这样写出来的算法,时间复杂度自己都掌握不好的。 + +例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。 + +在刷题的时候本着我说的标准来使用库函数,详细对大家回有所帮助! + + diff --git a/problems/知识星球精选/刷题攻略要刷两遍.md b/problems/知识星球精选/刷题攻略要刷两遍.md new file mode 100644 index 00000000..53907ee8 --- /dev/null +++ b/problems/知识星球精选/刷题攻略要刷两遍.md @@ -0,0 +1,62 @@ +# 代码随想录上的题目最好刷两遍以上 + +今天秋招可能要提前很多,往年9月份开始秋招,今天可能9月份就已经结束了,所以 正在准备秋招的录友,还是要抓紧时间了。。 + +星球里已经有录友的给出了关于秋招提前的信息 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210801104138.png) + +那么在正式秋招之前,大家在准备算法,代码随想录上的题目 应该刷几篇呢? + +**至少刷两遍,只刷一遍是不够的**。 + +只刷一遍基本就会忘,而且关键方法论理解的也不到位,对递归三部曲,回溯三部曲,动规五部曲,只掌握了简单招式,而没有理解真正精髓。 + +拿到最简单的反转链表来说,只做一遍,下次面试出现基本还是做不出来。 + +这也是星球里 录友们的 多么痛的领悟! + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210731183247.png) + +**等大家刷第二遍的时候,才能找到触类旁通的感觉!** + +第三遍基本就得心应手了。 + +在[「代码随想录」知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)中,我都是强调大家要至少刷两遍,有时间的话刷三遍, + +可以看看星球里录友们的打卡: + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210701122522.png) + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210701122422.png) + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210701122313.png) + +有的录友已经开始三刷: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727234031.png) + + +我为什么鼓励大家有时间的话,多刷几遍呢,首先这里的题目都是经典题目,而且在面试汇总也是频频出现, + +下面也是星球里的录友总结的面经: + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210701121136.png) + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210723125816.png) + + +## 那么已有的题目刷完了,可以刷些什么呢? + +我在Github上也做了一些题目的补充,在[上榜之后,都有哪些变化?](https://mp.weixin.qq.com/s/VJBV0qSBthjnbbmW-lctLA)说到了。 + +对于面试来说除了「代码随想录」上的题目,再了解一下:排序系列,简单图论(深搜,广搜,最小生成树,最短路径等),高级数据结构:并查集,字典树(了解一下),之后就差不多了。随便在leetcode找一些题目保持手感,题量至少300+,会稳一点。 + +关于深搜和广搜,其实深度优先搜索,我在二叉树的专题中讲解递归遍历,和回溯算法中 都讲了。 + +广度优先搜索,在二叉树树的层序遍历也讲了。 + +而图论中主要是在邻接表上进行的深搜和广搜。 + +面试中还是很少会考察图论,因为图论的代码量往往比较大,不适合在面试中考察,**面试中出现题目概率最大的是二叉树,回溯算法和动态规划!** + diff --git a/problems/知识星球精选/博士转行计算机.md b/problems/知识星球精选/博士转行计算机.md new file mode 100644 index 00000000..e8431318 --- /dev/null +++ b/problems/知识星球精选/博士转行计算机.md @@ -0,0 +1,47 @@ + +在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210903213924.png) + +一下是我的回答,在这里分享给大家。 + +我的一些研究生同学,都在读博,有的毕业有的还没毕业,平时和他们聊,对博士就业也是有一定的了解,这里说一说我的建议。 + +对于博士,强烈建议能去高校就去高校,这样最大程度发挥出了博士的好处,赚国家科研经费的钱还是香的。 + +虽然现在对青年研究者并不友好,基本经济大头都被实验室boss拿走了。 + +但高校壁垒高,外界再优秀的人才,也进不去和你竞争,所以可以小范围的卷。出来的话,就是和整个社会AI领域甚至和研发的同学一起卷。 + +**在企业 是谁有能力谁就上, 在高校,至少你得有博士学位才能上! 这就是很高的门槛了**。 + + +而且能给博士提供岗位的企业少之又少,所以博士的就业面反而窄了。 + +可能有同学想,薪酬要的低一点还不行么,其实博士毕业对薪资还是有要求的,如果薪资和本科,硕士应届生一样的话,自己也接受不了。 + +所以高校能给博士的机会更多一些,不过现在高校也是 青年科研人员都是 五年合同制,如果没有产出,也要走人了,压力也很大。 + +及时这样,还是建议能去高校去高校,当然这需要有心善、能力强、有人脉的博导,那是最好的了,(**注意这里选择博导,心善是最重要的一个选项**) + +实在去不了高校,接下来我们在看企业。 + +博士找工作不建议走正式招聘流程,例如走官网投递之类的,面试都没戏。 + +**AI岗现在对coding能力,工程能力要求都很高,企业现在特别喜欢有科研能力和工程能力的博士**,但这种人才还是稀缺的,大多数博士可能不会做那么多的工程项目,更别说还是本硕是非计算机专业的博士。 + +所以博士找工作要靠门派,最好你的导师,实验室大boss 有哪些徒弟在外面企业,BAT华为之类的干的很好,能联系上,就是同一门派的师兄弟。 + +联系上,做一个内推,他们看一下你的博士论文和研究成果,如果行的话,面试基本就是走个流程,这样就很舒服了。 + +如果上来一波算法题,然后 操作系统,网络 数据库,这样考察下来,基本计算机专业的博士也招架不住,毕竟大多数博士是科研型的,一般来说工程能力比较弱,计算机基础哪些基本也没时间看。 + + +再说一说非科班博士如果有机会去面试,**一定要重点突出知识的迁移能力,和对学术的研究能力,这个是硕士本科生所不能具备的**。 + +企业还是比较喜欢有快速学习能力和知识迁移能力的人,因为技术是不断在变化了,只有学习能力足够强再能跟上。 + +所以**不能和本科硕士去硬拼专业技能的储备量**,特别是最新最热的技术(因为本来就是非科班嘛), 要体现出博士对技术对知识的理解,这是你的优势。 + +以上是我的回答,希望多大家有所启发。录友们周末愉快🌹 + diff --git a/problems/知识星球精选/坚持的力量.md b/problems/知识星球精选/坚持的力量.md new file mode 100644 index 00000000..37e1c2da --- /dev/null +++ b/problems/知识星球精选/坚持的力量.md @@ -0,0 +1,69 @@ + +# 特殊的七夕 + +昨天在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)发了一个状态: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815084126.png) + +我还以为 过节嘛,录友们应该不会打卡了,但还依旧阻挡不辽录友打卡学习的步伐,来瞅瞅: + + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815100028.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815100109.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815100212.png) + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815095902.png) + + +当然了,我截图了一小部分,星球里每天的信息量都非常大。 + +如果说一个人坚持每天总结记笔记,**其实是很容易放弃的,今天不记,明天不急,后天不整理感觉也无所谓**。 + +这样时间就一点一点的被浪费掉了。 + +**因为我们学过的东西都会忘,不及时整理,时间就不能沉淀下来**,这就造成了一边学,一边忘,最后感觉自己好像也没学啥的感觉! + +所以每天记笔记,及时整理,是非常重要的。 + +这个习惯其实靠自己约束很容易放弃,但一群人一起坚持,就会不一样,大家相互监督,每天不总结记录点什么就会感觉少了点啥。 + +而且,大家每天的总结,我都会看,有问题 我都及时指出来,这样也防止自己学着学着学跑偏了。 + +昨天我也在[知识星球](https://mp.weixin.qq.com/s/X1XCH-KevURi3LnakJsCkA)回答了几位录友的问题,其中有两个问题 还是比较典型的,估计公众号里的录友也会遇到这样的疑惑。 + +所以也给大家说一说: + +## 准备的太晚了,想放弃秋招,直接准备春招 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815091442.png) + +很多准备今年秋招的录友感觉自己还没准备好,想先找实习,或者 自己在学习学习,然后直接春招。 + +其实不到万不得已,我还是建议要冲刺秋招。 + +如果说,因为没准备好,提前批放弃还是可以的,但秋招不能也直接放弃了! + +秋招没找到好工作,一般11月份左右,一些大厂还会有补招,腾讯就经常补招,实在不行再准备春招,春招可能国企单位会多一些。 + +**而且面试也很看缘分,永远没有真正准备好的时候,知识一直都学不完**,所以 把秋招当做最后的机会,就算秋招没找到,也可以在冲春招,而不是 直接放弃秋招。 + +还有就心态方面来说,直接放弃秋招,等 今年 10月份,身边同学都找到工作了,天天吃喝玩乐,见面打招呼就问:你去哪了,你签哪了。那时候 自己心里压力会非常大,甚至会影响 春招找工作。 + + +## HR/面试官问你手上有没有其他offer,如何回答 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815091819.png) + +这个问题,无论是校招还是社招,大家都会遇到。 + +如果大家手上有其他更好的offer,或者说同等水平公司的offer,可以说一说,这样凸显出自己的优势,即:你们不要我,有更好的公司要我, 这样给面试官或者HR点压力,可以争取到更高的薪酬。 + +如果没有更好的offer,可以说没有,然后解释:只认准贵公司,从技术氛围,职业发展,公司前景,来说贵司多么多么的好,我多么渴望和贵司一起成长之类的。**总之,就是捧起来,显得自己很专一**。 + +都是套路,哈哈哈哈。 + +**好了,说了这么多,希望对大家有所帮助**。 + + diff --git a/problems/知识星球精选/备战2022届秋招.md b/problems/知识星球精选/备战2022届秋招.md new file mode 100644 index 00000000..c48688e8 --- /dev/null +++ b/problems/知识星球精选/备战2022届秋招.md @@ -0,0 +1,61 @@ + +在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 + +![](https://img-blog.csdnimg.cn/20210507195443924.png) + +能感觉出来慌,不止这一位提问题的录友,很多同学都是这样,就是感觉一天天过的很快,也没干什么事情,然后心里就一直恐慌。 + +其实**慌主要是因为没有计划**,每天没有目的,然后一天一天的过,秋招越来越近,自然慌的很。 + +我在这篇里系统性的解答了实习相关的问题,[关于实习,大家可能有点迷茫!](https://mp.weixin.qq.com/s/xcxzi7c78kQGjvZ8hh7taA),也提到了 一般秋招8月份就要正式开始了,那时候各种提前批,面试小道消息,甚至身边一些同学已经拿到了offer,恐怕已经没有时间静下心好好学习了。 + +所以从现在看是满打满算,还有三个月的准备时间,如果利用好还是挺充足的,不要每天在把时间浪费在各种无聊的活动上。 + +这里我来列举一下,此时大家应该明确哪些事情: + +## 确定自己要面试的岗位 + +说道选择哪些岗位,一般的回答都是:选择自己感兴趣的呗,兴趣是最好的老师之类的balabala。 + +但我能亲身体会到,目前咱们的教育环境 也不可能说培养出什么 自己真正的兴趣,在大街上随便问一个人你的兴趣是什么? 基本回答都是:吃喝玩睡呗,还能有啥兴趣。 + +所以务实的建议是:现在去各大公司校招招聘官网 把所有的岗位都看一看,看看都有哪些要求,结合目前自己的经历和已经掌握的内容,看看哪些岗位可能最接近,然后再问问师兄师姐 这个岗位或者公司如何,最后后就把自己的目标岗位定下来了。 + +也有很多录友在星球里问我关于一些公司,岗位前景之类的问题,我都会给出相应的建议,这也是我工作过程中接触过了解过的。后面我也把部分内容整理一下,在公众号分享一下。 + +这样接下来的时间就是全身心去准备这个岗位所需要的技能。 + +**不少同学在秋招的时候,试试算法岗感觉也行,投投前端感觉也行,尝试后端也不是不可以,甚至再面面产品经理**。 + +**这样在秋招的时候就很被动了**,哪个岗位都没准备好,哪个岗位还都想试试,大概率是最后都没面上的。 + +所以现在就要把自己的目标岗位锁定了。 不同岗位之间 要求还是不一样的。 大家去看看招聘官网的要求就可以了。 + +## 制定学习计划 + +知道自己的目标岗位了,也知道岗位的要求了,剩下的就是制定详细的计划。 + +* 编程语言 +* 计算机基础(操作系统,网络,数据库、设计模式) +* linux相关(客户端岗位应该不需要) +* 项目 +* 准备自己的博客,github + +这几块按照岗位要求,8月份应该学会哪些内容,需要看哪些书等等。 + +然后以八月份以deadline开始倒推,每个月应该学哪些,每周应该学哪些,每天应该看那些。 + +把这些都明确了,心里就不慌了,也不会每天浪费大量宝贵的时间。 + +星球里的录友每天都在坚持打卡,总结自己今天学习的内容,这样就很好,把自己每天学习进度量化。 + +这样每天过的就很扎实。而且每天的打卡星球里录友和我都可以看到,我也会及时评论评论,大家也相互监督。 + +给大家看一位录友在星球里的总结: + +![](https://img-blog.csdnimg.cn/20210507204017952.png) + +大家平时的话,也要养成这种总结的习惯,只有及时总结把自己学过的内容积累下来,才能把时间沉淀下来,要不然就是一边学一边忘的节奏了。 + +**其实这种习惯,无论是秋招,还是准备跳槽,还是平时工作积累,都非常总要!** + diff --git a/problems/知识星球精选/大厂新人培养体系.md b/problems/知识星球精选/大厂新人培养体系.md new file mode 100644 index 00000000..165406f8 --- /dev/null +++ b/problems/知识星球精选/大厂新人培养体系.md @@ -0,0 +1,76 @@ +# 大厂的新人培养体系是什么样的 + +之前我一直在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)和大家讲,能进大厂一定要进大厂,大厂有比较好的培养体系。 + +也有录友在星球里问我,究竟培养体系应该是什么样的呢? 大厂都会这么培养新人么? + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210717173307.png) + +其实大厂部门也是非常多,不同的领导对待新人的态度也是不一样的。 + +就拿腾讯来说,腾讯里面 上千个部门,基本就是上千个小公司,只不过外面披一个腾讯的壳子,每个小公司的leader风格截然不同。 + +赶上什么样的领导了,这就看命运了。 + +**只能说进大厂,大概率会有一个比较好的培养体系**。 + +那么好的培养体系是什么呢? + +要从两个方面来说: + +* 给你详细的学习路线(自我技术提升) +* 给你有产出的活(用来晋升) + +## 详细的学习路线 + +关于详细的学习路线,一般大厂入职之后配有导师的,导师给你安排的每一个功能,应该带你熟悉整个研发的流程。 + +一个功能的开发,需要经历如下几步: + +1. 看需求文档,确定需求 +2. 这个需求包含了哪些功能 +3. 有哪些难点 +4. 后台架构是什么样的(要有架构图) +5. 定协议(前后台一起商量),服务与服务之间的,后台与客户端之间的 +6. 设计数据结构+算法=程序 +7. 预估一下容量(各种资源例如带宽,存储,CPU等等) +8. 考虑一下部署(安全性,容灾,可伸缩性。。。。) +9. 设计评审 +(上面过程都是在分析) +10. 编码 +11. 自测 +12. 联调 +13. 交给测试 +14. 代码review +15. 合入 +16. 发布 + +可以看出来,写代码仅仅是 其中的一小步。导师应该带你走一遍完整的开发流程,然后告诉一些注意事项,**这样为自己程序员生涯打好基础**。 + +可能有的同学会感觉:我就开发一个小功能,哪用得着这么多步骤,一把梭哈,直接代码写完。 + +哈哈,这么想的同学一般是没有参与过大型且流程规范的项目开发。互联网千万级用户的项目,几十上百人一起开发是需要规范的,**所以上面我说的每一步都很重要!** + +## 有产出的活 + +初入职场的同学,可能都非常在意能不能学到东西,也就是自我技术提升,往往忽视了你干的活,是否有产出,能不能用来晋升。 + +这里就是很多所谓的“套路”,老司机一般挑的活符合如下几点: + +* 非常规整(周边没有烂糟的额外工作,例如还要开发各种小工具之类的) +* 独立模块(不需要和其他人扯皮,省事) +* 对项目组很重要(既有技术难点,又没有大量的业务增删改查) +* 风险系数比较低(上线出问题,锅甩不到他这里) + +这种活就是好活,用来晋升的利器,而且干着也舒服。 + +但一个项目,一定会有大量需要打杂的活,写各种脚本,各种处理数据,然后看各种问题,整理文章,汇报,开发边缘工具等等。 + +新人一般进来都是先打杂的,**但如果领导确实是细心培养你,还是额外给你一个小模块,让你做好,这个小模块就是让你用来晋升的或者转正的**。 + +这个建议不仅适用于实习生,对于初入职场的同学也很用帮助,这个部门是不是有在培养你,老司机一眼就能看出来,只不过新人可能自己很难发现。 + +所以需要过来人点拨一下,大家就知道自己现在的处境了。 + +希望对大家求职和工作有所帮助! + diff --git a/problems/知识星球精选/如何权衡实习与秋招复习.md b/problems/知识星球精选/如何权衡实习与秋招复习.md new file mode 100644 index 00000000..ee2fbd24 --- /dev/null +++ b/problems/知识星球精选/如何权衡实习与秋招复习.md @@ -0,0 +1,43 @@ + +# 已经在实习的录友如何准备秋招? + +最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)一位录友问了实习生如何权衡工作和准备秋招的问题。 + + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210703230618.png) + +其实这个问题挺有代表性,我之前一直讲的都是没有去实习的录友应该怎么怎么办,其实已经在大厂实习的录友也有很多烦恼。 + +这里我说一说已经有大厂实习经历,准备秋招的重点。 + +一般来说有大厂的实习经历,**面试官的兴趣都在大厂实习的项目经验上**。 + +所以关于权衡实习和准备基础这两个方面,**可以把主要精力放在项目包装上,其次是看基础**。 + +要在包装实习项目上多花点心思,实习生做的项目偏上业务很正常,不可能让实习生搞太复杂的,一旦出了问题还得导师背锅。 + +自己干的活,或者项目很简单 不要紧,可以好好包装一下,如果没有难点,**可以结合业务自己“造”难点**,大厂内部研发文档都特别多而且特别全。 + +例如整个项目的立项,各个模块的开发,以及研发中遇到的困难,技术选型,上线事故,等等这些都是有完整的文档记录的。(当然大厂也有一些部门研发流程很原始,没有文档,全靠口述) + +从这些文档中也可以找出 难点糅合到自己的项目中。 + +假如线上出了事故,虽然自己不用去排查但可以跟着同事们一起看问题,一起分析,甚至帮他捞捞日志,打打下手。 + +这次事故的表现,起因,定位等等,排查问题的同事都会记录的清清楚楚,放在项目文档下。 + +可以把这些文档都多看看,然后就可以转变成自己排查线上事故的经历了。 + +**这种经历在面试官来看就是很大的加分项了**。 + +所以在大厂实习,想包装自己的项目方法有很多,只不过一些同学初入职场,对自己有帮助的资料或者内容不太敏感,不善于利用已有的资源。 + +**需要过来人点一下,基本就上道了,哈哈哈**。 + +当然不是说只要在大厂实习,基础完全就不用看了,抽空也要看,只不过 项目经验(项目的包装)更重要! + +关于提前批,一般来说本厂实习生是不能参加提前批的。 + +你可以参加 其他大厂的提前批,只不过参加提前批是有代价的,面试不通过都是有记录的,得看自己项目准备的如何,能不能拿出手,而且一边实习一边面试可能也不太方便,如果想试一试,就找自己不想去的企业的提前批试试水! + + diff --git a/problems/知识星球精选/客三消.md b/problems/知识星球精选/客三消.md new file mode 100644 index 00000000..869d39de --- /dev/null +++ b/problems/知识星球精选/客三消.md @@ -0,0 +1,91 @@ + +# 客三消! + +给大家科普一下:什么是客三消。 + +翻译过来就是客户端三年消失。 + +**听起来是不是有点吓人**!这种说法略夸张,但只要能传开,就说明客户端一定有一些困局,并不是空穴来风。 + +昨天卡哥在朋友圈里分享了一个段子的截图 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/IMG_3986.jpg) + +然后朋友圈就炸了,上百条的留言,问我这是为啥。 + +其实这个问题在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里也有录友问过我。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210905091037.png) + +当时已经详细的回答了一波,估计很多录友都有这方面的困惑,所以在公众号上再来给大家讲一讲。 + +**关于星球提问中SRE和后端,在这里就不介绍了,卡哥重点说一说,客户端**。 + +客户端目前比较突出的问题,主要是 这四点: + +1. 客户端岗位需求相对较小,而且有越来越小的趋势 + +2. 技术做深相对较难 + +3. 客户端晋升相对困难 + +4. 中年危机 (其实程序员有,不过客户端可能更明显一些) + + +## 岗位需求相对较小 + +客户端需求的减少,主要是体现在中小厂,或者说创业公司,因为大家都养不起原生客户端,基本都会采用跨端的技术方案,也就是大前端(即一套代码可以编译出各个端的版本,包括安卓,IOS等各种终端)。 + +这样就节省了很大的人力,不过目前在功能上一定没有 原生客户端体验好。 + +**但大前端取代客户端是技术趋势!** + +如果选择客户端,那么就多少要掌握一些跨端技术方案。 + +互联网软件的思维,就是轻前端,重后端,为什么PC软件搬到了浏览器上,移动APP搬到小程序上,都是这个道理,一般重头戏在后端。 + +所以后端的需求才会比较大。 + +## 技术做深相对较难 + +这里就不止客户端,其实前端都有这个问题。 + +关于前端和客户端的区别,其实没有那么严格的定义,大家可以理解 前端包含了客户端。一切可视化皆为前端。 + +前端框架、渲染引擎 变化相对快,可能你刚熟悉一个框架,然后就换了,最关键是可能还拿不准哪一种框架日后会成为主流,一不小心就跑偏了。 + +而后端框架变化相对就慢得多,而且 更容易(或者说更有机会)把技术做深,因为 高并发,高可用,低延迟 这些基本都是后端的工作。 + +正是前端 技术栈更新太快,所以要持续高强度学习 (这种学习可能不是往深去学习,而是 适应一个又一个框架的学习)。 + +而且前端 很容易陷入需求的反复变化之中,因为一个功能或者界面的修改,都是前端同学的工作量。 + +后端可能 什么都不用改,接口都是一样的,然后就可以空出时间研究技术。 + +## 晋升 + +目前在大厂,客户端职业天花板相对较低,一般情况下,可能到组长就到头了。 + +搞技术一路升上去,甚至到CTO的,基本都是后端,这也是因为前面讲过的:大部分的互联网产品,重头戏在后端,所有后端更有机会把技术做深,更直白说,后端更有机会在晋升做ppt的时候 “吹牛逼”。 + + +## 中年危机 + +这个就更范范一些了,程序员都有这个危机,不过客户端可能更突出一些。 + +原生客户端的岗位需求确实会越来越少,如果继续干下去,没有晋升到管理层,然后退居二线公司,发现二线公司都没有原生客户端的岗位,那么就非常被动了。 + +所以可以往大前端的方向去转。 + +大前端现在也有很多技术方案,ReactNative和weex(阿里,脸书的方案),Flutter(Google的方案),微信小程序(腾讯的方案) + +不过最终哪一个方案一统天下,这还是未知数,所以就需要持续学习咯。 + +# 总结 + +以上就是我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里的详细回答。 + +注意我这里说的一般情况,当然各个岗位都有佼佼者,或者说大牛,客户端也有大牛,也很香,不过这是极少数,就不在讨论范围内了。 + +希望对大家理解目前客户端的趋势有所帮助。 + diff --git a/problems/知识星球精选/技术不好如何选择技术方向.md b/problems/知识星球精选/技术不好如何选择技术方向.md new file mode 100644 index 00000000..ad8a777c --- /dev/null +++ b/problems/知识星球精选/技术不好如何选择技术方向.md @@ -0,0 +1,28 @@ + +# 技术不太好,也不知道对技术有没有兴趣,我该怎么选? + +最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里解答了不少录友们的疑惑,其实发现一个挺普遍的问题: + +* 我技术很一般 +* 对技术也没有什么追求 +* 要是对什么岗位感兴趣我也不知道 +* 以后自己喜欢干什么也不太清楚 + +**相信说到了不少录友心里去了, 其实目前应试教育下 确实很难找到自己感兴趣的事情**。 + +但我想说的是,并不是技术不好就什么都做不了,依然有很多选择,只不过录友们没有接触过,所以就不知道自己接下来要往哪个方向走。 + +这里我给出一些路线,大家可以参考: + +方向一:走纯研发路线,去大厂,如果真的对技术提不上兴趣可能会走的很辛苦。 + +方向二:如果技术还凑合,不做纯研发,退一步也可以考虑去大厂做测试相关的工作,对技术要求没有那么高,但也需要技术能力,而且技术能力越强越吃香。 + +方向三:去银行,证券,国企类的企业去做研发岗位,这种国有企业的技术面试相对简单不少,比较轻松,还很稳定,收入虽说不高,但生活足够滋润。 + +方向四:做toC(面向普通用户)的产品经理,toC产品经理这个岗位就特别卷,因为这个岗位门槛太低了,任何专业的同学都可以去做产品经理。 这样自己所学的技术就基本没有用了,也凸显不出技术上的优势,但如果自己真的对APP之类的各种应用得心应手,优点缺点,用户爽点、日活、次留等等手到擒来,倒可以试一试。 + +方向五:做toB的产品经理,包括云计算,大数据这些产品都是需要产品经理的,例如百度云,腾讯云,阿里云等等,这种产品本身就是技术产品,所以需要懂技术的产品经理来做设计,即需要产品的抓住需求的能力,也需要懂点技术,既可以发挥自己的技术能力,还可以做产品规划,基本也不用写代码。 + +对技术要求不高的岗位也挺多的,发展也很好,只要大家多去了解,总会找打符合自己的岗位。 + diff --git a/problems/知识星球精选/提前批已经开始了.md b/problems/知识星球精选/提前批已经开始了.md new file mode 100644 index 00000000..ec8ede8e --- /dev/null +++ b/problems/知识星球精选/提前批已经开始了.md @@ -0,0 +1,42 @@ + +最近华为提前批已经开始了,不少同学已经陆续参加了提前批的面试。 + +在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上就有录友问我这么个问题: + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210711002802.png) + +华为是比较看重学历的,如果学校比较好(985以上),华为的面试会随意一些,几乎就是走一个流程。 + +我记得当初校招的时候,华为来我们学校就是 几个大巴把整个计算机学院的同学拉到酒店,批量面试,面试过程差不多就是走个形式,大家基本都拿到offer了。 + +不是说 非985/211的同学 技术就不好,而是当企业每年要招上万人的时候,通过学历还筛选相对来说是 效率较高且成本最低的一种方式。 + +不过现在竞争越来越激烈了,华为也很少这种粗暴方式来召人。再说华为给出的薪酬相对互联网大厂也 很有竞争力,发展前景也很不错。 + +那么在说一说面试的内容。 + +可能有的同学感觉,我为了面试,准备了这么多,结果面试都没问,就问问项目问问编程语言就完事了。 + +这其实很正常! + +不同的公司,同一个公司不同部门,同一个部门不同面试官 面试风格都不太一样。 + +可能部门就比较缺人,面试官看一下 简历 学校可以,技术看上去还凑合,项目也还行,那么面试可能就放水一点,然后就过了。 + +毕竟面试官也很忙,在大厂谁都不想当面试官,都是工作之余加班的工作量,**所以面试官也想快点结束**。 + +还有另一种可能,就是部门已经招满了,但依然安排了面试,那么面试官就随便问问,然后也不会招人了。 + +还有一种,就是有的面试官就习惯考察算法题,问完算法了,其他的他也就不会问了。 + +因为操作系统,网络,数据库这些面试官在面试之前也要突击准备的,工作那么多年,都忘的差不多了,**所以要复习一波,这也是工作(都是加班啊!)**。 + +甚至可能面试官前天刚要和女朋友过生日,然后就没准备计算机基础方面的内容,索性面试的时候也就不问了..... + +这都是有可能的,很多同学可能没做过面试官,所以对一些面试过程就容易想不通,其实面试官也是普普通通的打工仔,他也不想加班,也想只要人品端正,积极肯干,随便召个技术差不多的就算了,哈哈哈。 + +所以说,面试有的时候也很看缘分的,大家辛辛苦苦造火箭,结果面试都没问是很正常的。 + +大家也放平心态,把该做的做好,剩下的交个天意了。 + + diff --git a/problems/知识星球精选/秋招的上半场.md b/problems/知识星球精选/秋招的上半场.md new file mode 100644 index 00000000..8ba938ea --- /dev/null +++ b/problems/知识星球精选/秋招的上半场.md @@ -0,0 +1,51 @@ + +# 秋招上半场的总结 + +八月份已经接近尾声,不少录友已经在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 已经总结了秋招的上半场。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210829214839.png) + +可以看出 这位录友也是身经百战,目前也拿到了几个offer。 + +星球里还有不少录友已经拿到了字节,阿里,百度提前批的offer。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210829231035.png) + +不过绝大部分录友还在经受着考验,处于焦虑的状态,秋招上半场也是几多欢喜几多愁。 + +找工作其实是一个很虐心的过程,没有offer、没准备好、面试没发挥好、差一点就能把这题过了 等等,每一个场景都给大家增添一份焦虑。 + +星球里有一些录友就找到了一个方向,或者一个准备同一家公司的伙伴,就会好一些。 + +![找到了同伴交流](https://code-thinking-1253855093.file.myqcloud.com/pics/20210820093109.png) + +**有时候,有压力,自己憋着,没人交流,只会压力越来越大**。 + +对于还没有offer的录友,我对大家的建议也是,**心态要稳住,要适当放低预期,不是所有人都要大厂,但不能放低自己对学习的要求!** + +有些同学,经过几次面试的打击之后,直接就自暴自弃,狂玩几天想释放压力,这么做的结果,只会压力越来越大。 + +所以,**秋招进行时,大家不要过于放松,无论什么情况,只要没有拿到心仪offer,就不能放松,一旦放松之后,换来的就是更看不到希望**。 + +有的同学可能学校不好,有的同学是转行计算机,一路下来确实艰难。 + +我在星球里,看到的不仅是大家准备秋招过程的每日学习总结、打卡,也看到了一些录友的不容易。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210829221259.png) + +说实话,看着评论区,还是很感动的,估计这位 打卡的录友,也得到了很大的鼓励。 + +这可能是 成千上万 目前正在冲刺秋招应届生 的一个缩影。 + +面试不仅仅是只看技术,也挺看缘分的,有的同学可能感觉莫名其妙的就挂了,有的同学可能感觉莫名其妙的就拿到了offer。 + +我就简单列举几个原因。 + +* 可能部门缺人,或满了 +* 可能是当天面试的同学都不太行,就矬子里拔大个 +* 可能之前有几个优秀的毕业生,但按照之前的标准都没过,然后面试官发现这么下去招不到人了,一下子就把标准降低了,然后轮到了你,你感觉你发挥的并不好,但也给你offer了。 + +所以面试也有很多很多其他因素,也很看缘分。 + +大家放平心态就好。 + diff --git a/problems/知识星球精选/秋招进行中的迷茫与焦虑.md b/problems/知识星球精选/秋招进行中的迷茫与焦虑.md new file mode 100644 index 00000000..bdd59d4f --- /dev/null +++ b/problems/知识星球精选/秋招进行中的迷茫与焦虑.md @@ -0,0 +1,50 @@ +# 秋招进行时,其实大家都很焦虑 + +大家应该都发现了,提前批和秋招都越来越提前的,大部分的录友此时的心态还是挺焦虑的。 + +特别是大三的同学吧,同时面临这找工作和考研两个方向的诱惑。 + +一位录友就在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)问了我这个问题: + +![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210724183240.png) + +其实 互联网35岁中年危机,应该吓退了不少小鲜肉,互联网35岁中年危机是真的,网上哪些关于裁员的消息 大多数也都是真的。 + +但我想说:特别是正在找工作的同学,大家应该都是 95后,00后,可以先不用想那么长远,能把未来五年规划好,就不错不错的了,现在行业的变化,都是两三年一变天,等大家35岁的时候,都不一定啥样了。 + +而且卡哥还替大家先趟趟路,哈哈哈 + +现在的大三,最忙的就是两伙人,**考研的和找工作的,这两条路都挺难的**。 + +另外还有不少录友应该在考研与找工作之间摇摆。可能有的学校大多数都在找工作,有的学校大多数都在考研,不过应该考研占绝大多数。 + +关于考研我的观点是,如果 本科毕业能拿到大厂或者中厂offer,可以不考研,看看自己比较优秀的学长学姐,毕业都去哪了,是否去了大厂,如果比较优秀的学长学姐 就业也一般,我还是推荐读研的,因为顺便也提升一下学历。 + +但有的同学是从大一入学就规划了自己 以后直接工作的,这种无论学校如何,我都是比较支持的! + +**因为从大一就明确自己的方向,按找工作的要求来学习,一般来说 最后找工作都不会差**。 + +最危险的是,大一大二没计划,到了大三开始摇摆,考研还是找工作。这种是最危险的,如果在纠结一阵纠结到 现在的话,那基本哪条路都走不好了。 + +对于现在找工作的录友,可能发现身边的同学都在考研,而且在准备找工作中,可能还没有明确的学习计划,东打一发西扯一下,就会很焦虑,主要也是身边一起工作的同学可能不多,交流的少。 + +找工作是一个累心的过程,非常累,恨不得哪家公司赶紧给我个offer,让我干啥都行,甚至怀疑自己是不是要再去考研。 + +**其实这时候,不是自己方法不对,也不是自己选择的路错了,而是需要一个过来人,给你打打气**。 + +静下心来,把最近开始面试的公司排一下,把自己还要学习的内容做好计划,都列出来,按着一步一步去执行,心里会踏实的多。 + +再说考研,考研也一点都不轻松,进大厂卷,**现在计算机考研比进大厂还卷(特别是名校计算机)**,如果考研没考上,找工作还挺难的,毕竟考研那套知识,对于找工作来说几乎没啥用。 + +所以不论是找工作,还是考研,大家都是一样的焦虑,每条路都不好走,但自己一旦选择了,就坚持下来,走好自己的路。 + +话再说回来,**现在不论身在什么阶段,都离不开“卷”,就算最后进了大厂工作,依然也是卷**。 + +大家都感觉自己准备面试好辛苦,好心累。其实给你面试的面试官,可能自己手上的模块线上又出问题了,还要担心年底是不是要背锅了,是不是年终没了,晋升不了了,是不是要准备跳槽了,甚至应届生的工资比自己的还高 等等。 + +**所以面试官也许比你还心累!** + +是不是想到这里,心里就舒服点了,哈哈哈哈,其实是有时候自己很迷茫但没有人沟通,就会陷入一个死循环,只要和过来人聊一聊,没啥大不了的。 + +大家其实这这样。 + diff --git a/problems/知识星球精选/英语到底重不重要.md b/problems/知识星球精选/英语到底重不重要.md new file mode 100644 index 00000000..d1f647c0 --- /dev/null +++ b/problems/知识星球精选/英语到底重不重要.md @@ -0,0 +1,53 @@ +# 对程序员来说,英语到底重不重要 + +在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)有一位录友问了我这么一个问题。 + +![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210605193955.png) + +这个问题我曾经在上学的时候也思考过。 + +这次正好来好好说一说。 + +当时我搞ACM的时候都是英文题目的,哪会有中文题目,现在力扣全面汉化也是最近几年的事情。 + +如今又工作了这么多年后重新看待这个问题,又有更全面的看法了。 + +其实我想说,**对英语对程序员即重要,也不重要!** 这是要看环境,看背景的。 + +如果你现在在准备秋招,或者是跳槽,目标是冲刺国内大厂,那么暂时不用花费精力学英语,就算四级都没过,大厂面试官也不会问你过没过四六级的。 + +貌似华为对英语四六级是有要求的,如果面试BAT,英语不是关键性问题。 + +但工作之后,英语其实就很重要了,也要注意程序员英语和普通英语是不一样的。 + +一手的技术资料,和优秀的问答 基本都是英文的,国内的资料都是别人嚼过的,质量参差不齐。 + +而且国内的问答社区其实环境并不好(懂的人都懂),真正解决问题,还得靠Stack Overflow。 + +**所以技术文档(英文),Stack Overflow , Quora才是程序员的利器**。 + +工作以后如果你把程序员英语(注意不是普通英语)练好,其实对技能和视野的提升是很有帮助的。 + +这里为什么强调是程序员英语呢, 因为有太多专业词是CS特有的,而不是日常英语。 + +**继承,多态,变量,英文怎么说? 估计可以难住不少人了**。 + +所以当我们查问题的时候,第一反应 一定是用 中文关键词去搜索,因为我们不知道对应的英文关键词(也懒的去查一下)。 + +所以英语好,这是一种技术壁垒,可以任意遨游在中文和英文的世界里,有两极的思考! + +**那么对程序员来说,英语口语重要么?** + +如果你直接想去外企的话,练一练吧,也是挺重要的,如果在国内的话,用处不太大。 + +那一定有人说了:练好口语 一定是有利的。 + +这个我也 赞同,练啥其实都有有利的,但我们要看**投入产出比** + +我在学校的时候英语口语还是挺不错的,当时学校的留学生我基本都认识,和他们扯扯皮没问题,可工作这些年之后,全!都!还!回!去!了! + +所以如果练习口语,一定要有目标,要么就是雅思托付考试要出国,要么就一定要去外企找机会transfer美帝,这样有一个环境可以一直保持下去。 + +否则,花费大量时间练习,其实仅仅是感动自己,过不了多久,就都还回去。(例如说我,哈哈哈哈) + + diff --git a/problems/知识星球精选/要不要考研.md b/problems/知识星球精选/要不要考研.md new file mode 100644 index 00000000..d67b95b7 --- /dev/null +++ b/problems/知识星球精选/要不要考研.md @@ -0,0 +1,40 @@ +# 到底要不要读研 + +在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里讨论了一下关于要不要读研的问题。 + +![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210613230829.png) + +其实不少同学纠结于计算机专业要不要考研。 + +我的观点是 **如果认为自己本科毕业 可以拿到大厂的研发岗offer,那么就不用读研**(除非保研到一个特别好的学校了)。 + +那么怎么能发现自己本科毕业能不能拿到大厂offer呢。 + +看看自己学生学哥学姐,大部分人的就业去向,如果很多都可以进入大厂,那么就可以追寻他们的足迹。 + +如果自己学校本科毕业,就业比较一般,那么就去读研吧。 + +当然这里还有一个情况,就是算法岗,算法岗一般要求研究生学历以上。但算法岗现在很卷,985高校研究生,找算法岗的工作都很难,既要顶会,也要coding的能力。 + +目前的现况是很多搞AI的985研究生都在转研发岗,**但如果你依然立志从事人工智能(说明是真的热爱),那么就去读研吧**。 + +研究生毕业去做研发岗和本科毕业做的研发,其工作其实没区别。那么为什么读研呢。 + +现在环境就比较卷,两个候选人,实力差不多,一个本科,一个研究生,价钱也差不多,那么大厂就要个研究生呗,在招生简章里看着也好看,说明公司都是高学历人才。 + +当然一般来说 研究生毕竟又多读了 两三年,普遍会比本科强一些。 + +**PS:大厂研发岗校招本科和研究生薪资几乎没啥差别**。 + + +那么话在说回来,**如果打算考研,那么就争取更好学校的研究生,提升一下学历,把考研所付出的努力最大化**。 + +最后关于本科生要不要读研: + +* 本科如果有实力去大厂做研发,那么就去! + +* 如果本科去不了大厂,可以考虑考研,考研是一次提升学历的机会,一旦选择考研这条路,就给自己点压力! + +* 如果知道AI岗位目前就业情况,依然要立志从事AI,那么就去读研 + + diff --git a/problems/知识星球精选/面试中发散性问题.md b/problems/知识星球精选/面试中发散性问题.md new file mode 100644 index 00000000..550b51d2 --- /dev/null +++ b/problems/知识星球精选/面试中发散性问题.md @@ -0,0 +1,40 @@ +# 面试中遇到发散性问题,应该怎么办? + +这周在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)有一位录友问了我这么一个问题,我感觉挺有代表性的,应该不少录友在面试中不论是社招还是校招都会遇到这一类的问题。 + +问题如下: + +![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210529183636.png) + +首先面试官评价:基本的知识都懂还可以,但是知识碎片化。 + +因为现在基本大家都是背面经,所以对考点知识点掌握的都不错,确实对整体上理解不够。 + +但如果想对整体上理解深入,需要花费很大精力的,而且要把书看的很透彻,那这种候选人基本都是拔尖的。 + +关于操作系统啊,数据库等等,大多数录友应该都是靠面经,其实背面经也是最高效,性价比最高的方式的,如果真的去把书看透,一本《深入理解计算机系统》够看一年了。。。。 + +所以面试官基本不会因为这个问题而把你pass掉,那位提问的录友也是顺利进入了三面。 + +那么面试中遇到这种发散性问题应该怎么办呢? + +其实他问的这种问题,**就没指望你能说出 正确的答案,这是没有标准答案的**,例如淘宝京东的那种登录的场景 没有经历过 是不知道究竟怎么回事的。 + +而问你对操作系统的理解,也是千人千面没有标准的。 + +遇到这种问题,你就结合自己的想法,大胆说,不要说这个我不知道,那个我没遇到过之类的。 + +你说的解决方案,一定是有问题的,面试官在质疑你的时候,**你要表现出很兴奋,积极和面试官讨论:为什么不对**,然后说出你的观点,结合你所知道的理论知识。 + +大胆说,不要怕,一般情况你的理论知识都比面试官强,面试官工作好多年了基础知识早忘了,基本都是面试你前一天突击一个小时(暴漏真相了哈哈哈) + +**忌讳:面试官一质疑你,你就开始怀疑自己,心想那我说的不对吧,然后就不说话了。。。** + +最后这种发散性的问题,也没法去专门准备,因为这种问题主要是**考察候选人对技术的态度和沟通能力!** + +所以大家如果在面试遇到这一类发散性问题,一定要积极沟通,**表现出你对技术的追求和优秀的沟通能力**。 + +**注意 和面试官讨论的时候要面带微笑,不要板着脸,面试官也会喜欢以后和这样的人做同事!** + +好咯,心法已经传授给大家了。 + From 9170ed34209a999414b13c9a4976e25fdaa4d06a Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 5 Sep 2021 23:34:22 +0800 Subject: [PATCH 017/222] Update --- README.md | 39 ++++++++++--------- ...持的力量.md => 不一样的七夕.md} | 0 2 files changed, 21 insertions(+), 18 deletions(-) rename problems/知识星球精选/{坚持的力量.md => 不一样的七夕.md} (100%) diff --git a/README.md b/README.md index 8a3574fa..bc890f7e 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ * 编程语言 * [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP) + * 项目 * [基于跳表的轻量级KV存储引擎](https://github.com/youngyangyang04/Skiplist-CPP) * [Nosql数据库注入攻击系统](https://github.com/youngyangyang04/NoSQLAttack) @@ -96,6 +97,7 @@ * [看了这么多代码,谈一谈代码风格!](./problems/前序/代码风格.md) * [力扣上的代码想在本地编译运行?](./problems/前序/力扣上的代码想在本地编译运行?.md) * [什么是核心代码模式,什么又是ACM模式?](./problems/前序/什么是核心代码模式,什么又是ACM模式?.md) + * 工具 * [一站式vim配置](https://github.com/youngyangyang04/PowerVim) * [保姆级Git入门教程,万字详解](https://mp.weixin.qq.com/s/Q_O0ey4C9tryPZaZeJocbA) @@ -120,7 +122,6 @@ * [递归算法的时间与空间复杂度分析!](./problems/前序/递归算法的时间与空间复杂度分析.md) * [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md) - ## 社群 * [准备秋招的录友们,组织在这里!](https://mp.weixin.qq.com/s/xX4LFwZQIG_XiQAxVBrfeA) @@ -128,22 +129,25 @@ ## 知识星球精选 -* [HR面注意事项](https://mp.weixin.qq.com/s/0mDyCyCBfa0DeGov3Pebnw) -* [刷题攻略要刷两遍!](https://mp.weixin.qq.com/s/e3_L7FZglY4UlTVvKolZyQ) -* [秋招进行中的迷茫与焦虑......](https://mp.weixin.qq.com/s/X15MUw4sfH_AQNHdAivEvg) -* [大厂新人培养体系应该是什么样的?](https://mp.weixin.qq.com/s/WBaPCosOljB5NEkFL2GhOQ) -* [你的简历里「专业技能」写的够专业么?](https://mp.weixin.qq.com/s/bp6y-e5FVN28H9qc8J9zrg) -* [Carl看了上百份简历,总结了这些!](https://mp.weixin.qq.com/s/sJa87MZD28piCOVMFkIbwQ) -* [备战2022届秋招](https://mp.weixin.qq.com/s/7q7W8Cb2-a5U5atZdOnOFA) -* [技术不太好,如果选择方向](https://mp.weixin.qq.com/s/ZCzFiAHZHLqHPLJQXNm75g) -* [刷题要不要使用库函数](https://mp.weixin.qq.com/s/6K3_OSaudnHGq2Ey8vqYfg) -* [关于实习的几点问题](https://mp.weixin.qq.com/s/xcxzi7c78kQGjvZ8hh7taA) -* [面试中遇到了发散性问题,怎么帮?](https://mp.weixin.qq.com/s/SSonDxi2pjkSVwHNzZswng) -* [英语到底重不重要!](https://mp.weixin.qq.com/s/1PRZiyF_-TVA-ipwDNjdKw) -* [计算机专业要不要读研!](https://mp.weixin.qq.com/s/c9v1L3IjqiXtkNH7sOMAdg) -* [关于提前批的一些建议](https://mp.weixin.qq.com/s/SNFiRDx8CKyjhTPlys6ywQ) -* [已经在实习的录友要如何准备秋招](https://mp.weixin.qq.com/s/ka07IPryFnfmIjByFFcXDg) -* [华为提前批已经开始了](https://mp.weixin.qq.com/s/OC35QDG8pn5OwLpCxieStw) +* [为什么都说客户端会消失](./problems/知识星球精选/客三消.md) +* [博士转计算机如何找工作](./problems/知识星球精选/博士转行计算机.md) +* [不一样的七夕](./problems/知识星球精选/不一样的七夕.md) +* [HR面注意事项](./problems/知识星球精选/HR面注意事项.md) +* [刷题攻略要刷两遍!](./problems/知识星球精选/刷题攻略要刷两遍.md) +* [秋招进行中的迷茫与焦虑......](./problems/知识星球精选/秋招进行中的迷茫与焦虑.md) +* [大厂新人培养体系应该是什么样的?](./problems/知识星球精选/大厂新人培养体系.md) +* [你的简历里「专业技能」写的够专业么?](./problems/知识星球精选/专业技能可以这么写.md) +* [Carl看了上百份简历,总结了这些!](./problems/知识星球精选/写简历的一些问题.md) +* [备战2022届秋招](./problems/知识星球精选/备战2022届秋招.md) +* [技术不太好,如果选择方向](./problems/知识星球精选/技术不好如何选择技术方向.md) +* [刷题要不要使用库函数](./problems/知识星球精选/刷力扣用不用库函数.md) +* [关于实习的几点问题](./problems/知识星球精选/关于实习大家的疑问.md) +* [面试中遇到了发散性问题,怎么办?](./problems/知识星球精选/面试中发散性问题.md) +* [英语到底重不重要!](./problems/知识星球精选/英语到底重不重要.md) +* [计算机专业要不要读研!](./problems/知识星球精选/要不要考研.md) +* [关于提前批的一些建议](./problems/知识星球精选/关于提前批的一些建议.md) +* [已经在实习的录友要如何准备秋招](./problems/知识星球精选/如何权衡实习与秋招复习.md) +* [华为提前批已经开始了](./problems/知识星球精选/提前批已经开始了.md) ## 杂谈 @@ -153,7 +157,6 @@ * [大半年过去了......](https://mp.weixin.qq.com/s/lubfeistPxBLSQIe5XYg5g) * [一万录友在B站学算法!](https://mp.weixin.qq.com/s/Vzq4zkMZY7erKeu0fqGLgw) - ## 数组 1. [数组过于简单,但你该了解这些!](./problems/数组理论基础.md) diff --git a/problems/知识星球精选/坚持的力量.md b/problems/知识星球精选/不一样的七夕.md similarity index 100% rename from problems/知识星球精选/坚持的力量.md rename to problems/知识星球精选/不一样的七夕.md From b8306238f4bf26ddc26ae107e5266cca11e697ec Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 5 Sep 2021 23:36:34 +0800 Subject: [PATCH 018/222] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc890f7e..fa1b603b 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ ## 社群 -* [准备秋招的录友们,组织在这里!](https://mp.weixin.qq.com/s/xX4LFwZQIG_XiQAxVBrfeA) +* [准备校招的录友们,组织在这里!](https://mp.weixin.qq.com/s/5vKadlE1g2HjDpo2-y2ZFw) * [准备社招的录友们,组织在这里!](https://mp.weixin.qq.com/s/mbQ3s17ZJ4LXFRb-VD58Ww) ## 知识星球精选 From cae6b56b2ddda9abfc7f1116852cb11ad1e2d811 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Mon, 6 Sep 2021 10:50:21 +0800 Subject: [PATCH 019/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00112.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8C.mdJava=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0112.路径总和.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 283a9913..da62452c 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -411,6 +411,31 @@ class solution { } ``` +```java +// 解法2 +class Solution { + List> result; + LinkedList path; + public List> pathSum (TreeNode root,int targetSum) { + result = new LinkedList<>(); + path = new LinkedList<>(); + travesal(root, targetSum); + return result; + } + private void travesal(TreeNode root, int count) { + if (root == null) return; + path.offer(root.val); + count -= root.val; + if (root.left == null && root.right == null && count == 0) { + result.add(new LinkedList<>(path)); + } + travesal(root.left, count); + travesal(root.right, count); + path.removeLast(); // 回溯 + } +} +``` + ## python 0112.路径总和 From 3450a85b6d1318ea5288dccd8475e57069c5a2aa Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Mon, 6 Sep 2021 11:32:18 +0800 Subject: [PATCH 020/222] =?UTF-8?q?=E4=BC=98=E5=8C=960106.=E4=BB=8E?= =?UTF-8?q?=E4=B8=AD=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?.mdJava=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0106.从中序与后序遍历序列构造二叉树.md | 1 + 1 file changed, 1 insertion(+) diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 39b55d8c..a9639d8f 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -607,6 +607,7 @@ class Solution { for (int i = inLeft; i < inRight; i++) { if (inorder[i] == rootVal) { rootIndex = i; + break; } } // 根据rootIndex划分左右子树 From 2c584ce661768c35ac4e16f5af0cbbbf339b4bf4 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Mon, 6 Sep 2021 14:47:46 +0800 Subject: [PATCH 021/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00617.=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E4=BA=8C=E5=8F=89=E6=A0=91.md=E9=98=9F=E5=88=97?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3Java=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0617.合并二叉树.md | 39 +++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/problems/0617.合并二叉树.md b/problems/0617.合并二叉树.md index 22a527f9..e21efcb3 100644 --- a/problems/0617.合并二叉树.md +++ b/problems/0617.合并二叉树.md @@ -274,7 +274,7 @@ class Solution { ```Java class Solution { - // 迭代 + // 使用栈迭代 public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { if (root1 == null) { return root2; @@ -310,6 +310,43 @@ class Solution { } } ``` +```java +class Solution { + // 使用队列迭代 + public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { + if (root1 == null) return root2; + if (root2 ==null) return root1; + Queue queue = new LinkedList<>(); + queue.offer(root1); + queue.offer(root2); + while (!queue.isEmpty()) { + TreeNode node1 = queue.poll(); + TreeNode node2 = queue.poll(); + // 此时两个节点一定不为空,val相加 + node1.val = node1.val + node2.val; + // 如果两棵树左节点都不为空,加入队列 + if (node1.left != null && node2.left != null) { + queue.offer(node1.left); + queue.offer(node2.left); + } + // 如果两棵树右节点都不为空,加入队列 + if (node1.right != null && node2.right != null) { + queue.offer(node1.right); + queue.offer(node2.right); + } + // 若node1的左节点为空,直接赋值 + if (node1.left == null && node2.left != null) { + node1.left = node2.left; + } + // 若node2的左节点为空,直接赋值 + if (node1.right == null && node2.right != null) { + node1.right = node2.right; + } + } + return root1; + } +} +``` ## Python From 425593d78230462ede74c026fab8b119564c8ea1 Mon Sep 17 00:00:00 2001 From: bourne-3 <595962708@qq.com> Date: Mon, 6 Sep 2021 22:16:23 +0800 Subject: [PATCH 022/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0java=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0143=E9=87=8D=E6=8E=92=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0143.重排链表.md | 41 +++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index 76df63b7..62d4cb3f 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -219,6 +219,47 @@ public class ReorderList { return headNode.next; } } + +------------------------------------------------------------------------- +// 方法一 Java实现,使用数组存储节点 + class Solution { + public void reorderList(ListNode head) { + // 双指针的做法 + ListNode cur = head; + // ArrayList底层是数组,可以使用下标随机访问 + List list = new ArrayList<>(); + while (cur != null){ + list.add(cur); + cur = cur.next; + } + cur = head; // 重新回到头部 + int l = 1, r = list.size() - 1; // 注意左边是从1开始 + int count = 0; + while (l <= r){ + if (count % 2 == 0){ + // 偶数 + cur.next = list.get(r); + r--; + }else { + // 奇数 + cur.next = list.get(l); + l++; + } + // 每一次指针都需要移动 + cur = cur.next; + count++; + } + // 当是偶数的话,需要做额外处理 + if (list.size() % 2== 0){ + cur.next = list.get(l); + cur = cur.next; + } + + // 注意结尾要结束一波 + cur.next = null; + } +} + ``` Python: From cd7ef344e76cfb913256e65076de5d62cf47080c Mon Sep 17 00:00:00 2001 From: bourne-3 <595962708@qq.com> Date: Mon, 6 Sep 2021 22:36:27 +0800 Subject: [PATCH 023/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0java=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0143=E9=87=8D=E6=8E=92=E9=93=BE=E8=A1=A8=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=BA=8C=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0143.重排链表.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index 62d4cb3f..2b4e68b7 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -177,6 +177,7 @@ public: Java: ```java +// 方法三 public class ReorderList { public void reorderList(ListNode head) { ListNode fast = head, slow = head; @@ -259,6 +260,35 @@ public class ReorderList { cur.next = null; } } +------------------------------------------------------------------------- +// 方法二:使用双端队列,简化了数组的操作,代码相对于前者更简洁(避免一些边界条件) +class Solution { + public void reorderList(ListNode head) { + // 使用双端队列的方法来解决 + Deque de = new LinkedList<>(); + // 这里是取head的下一个节点,head不需要再入队了,避免造成重复 + ListNode cur = head.next; + while (cur != null){ + de.offer(cur); + cur = cur.next; + } + cur = head; // 回到头部 + + int count = 0; + while (!de.isEmpty()){ + if (count % 2 == 0){ + // 偶数,取出队列右边尾部的值 + cur.next = de.pollLast(); + }else { + // 奇数,取出队列左边头部的值 + cur.next = de.poll(); + } + cur = cur.next; + count++; + } + cur.next = null; + } +} ``` From e0d71863c590e37f61c7c135fa5e3a99de8fc0a0 Mon Sep 17 00:00:00 2001 From: Ryhsman Date: Mon, 6 Sep 2021 23:02:35 +0800 Subject: [PATCH 024/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=86=85=E5=AD=98=E9=87=8A=E6=94=BE=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0450.删除二叉搜索树中的节点.md | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index 35c8e24d..aa6bee76 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -118,10 +118,28 @@ public: if (root == nullptr) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了 if (root->val == key) { // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 + if (root->left == nullptr && root->right == nullptr) + { + ///! 内存释放 + delete root; + return nullptr; + } // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点 - if (root->left == nullptr) return root->right; + else if (root->left == nullptr) + { + auto retNode = root->right; + ///! 内存释放 + delete root; + return retNode; + } // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 - else if (root->right == nullptr) return root->left; + else if (root->right == nullptr) + { + auto retNode = root->left; + ///! 内存释放 + delete root; + return retNode; + } // 第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置 // 并返回删除节点右孩子为新的根节点。 else { From 3db7b5290d12f91124bfc13668b7a2cbbec6bfe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Mon, 6 Sep 2021 23:06:37 +0800 Subject: [PATCH 025/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E7=AC=AC15?= =?UTF-8?q?=E9=A2=98.=20=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C=20Swift?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0015.三数之和.md | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index adb9a113..6b5311ae 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -434,6 +434,46 @@ class Solution { } ``` +Swift: +```swift +// 双指针法 +func threeSum(_ nums: [Int]) -> [[Int]] { + var res = [[Int]]() + var sorted = nums + sorted.sort() + for i in 0 ..< sorted.count { + if sorted[i] > 0 { + return res + } + if i > 0 && sorted[i] == sorted[i - 1] { + continue + } + var left = i + 1 + var right = sorted.count - 1 + while left < right { + let sum = sorted[i] + sorted[left] + sorted[right] + if sum < 0 { + left += 1 + } else if sum > 0 { + right -= 1 + } else { + res.append([sorted[i], sorted[left], sorted[right]]) + + while left < right && sorted[left] == sorted[left + 1] { + left += 1 + } + while left < right && sorted[right] == sorted[right - 1] { + right -= 1 + } + + left += 1 + right -= 1 + } + } + } + return res +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 0fa9cc1b070acfd76945e7593c07e7c87e23f641 Mon Sep 17 00:00:00 2001 From: Ryhsman Date: Mon, 6 Sep 2021 23:14:02 +0800 Subject: [PATCH 026/222] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=9A=84c++=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E4=B8=8E=E6=95=B4=E4=BD=93=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0450.删除二叉搜索树中的节点.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index aa6bee76..b8a1ae87 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -118,23 +118,20 @@ public: if (root == nullptr) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了 if (root->val == key) { // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 - if (root->left == nullptr && root->right == nullptr) - { + if (root->left == nullptr && root->right == nullptr) { ///! 内存释放 delete root; return nullptr; } // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点 - else if (root->left == nullptr) - { + else if (root->left == nullptr) { auto retNode = root->right; ///! 内存释放 delete root; return retNode; } // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 - else if (root->right == nullptr) - { + else if (root->right == nullptr) { auto retNode = root->left; ///! 内存释放 delete root; From 5769c6c7e3af60c6bd4dcaa6441caa1c709303e7 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Tue, 7 Sep 2021 10:26:57 +0800 Subject: [PATCH 027/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00530.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E7=BB=9D=E5=AF=B9=E5=80=BC=E5=B7=AE.md=E8=BF=AD=E4=BB=A3Java?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0530.二叉搜索树的最小绝对差.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0530.二叉搜索树的最小绝对差.md b/problems/0530.二叉搜索树的最小绝对差.md index ae6719ec..db2ca2d4 100644 --- a/problems/0530.二叉搜索树的最小绝对差.md +++ b/problems/0530.二叉搜索树的最小绝对差.md @@ -171,7 +171,34 @@ class Solution { } } ``` +迭代法-中序遍历 +```java +class Solution { + TreeNode pre; + Stack stack; + public int getMinimumDifference(TreeNode root) { + if (root == null) return 0; + stack = new Stack<>(); + TreeNode cur = root; + int result = Integer.MAX_VALUE; + while (cur != null || !stack.isEmpty()) { + if (cur != null) { + stack.push(cur); + cur = cur.left; // 左节点入栈 + }else { + cur = stack.pop(); // 右节点入栈 + if (pre != null) { + result = Math.min(result, cur.val - pre.val); + } + pre = cur; + cur = cur.right; + } + } + return result; + } +} +``` ## Python 递归 From 300f4a32d115c6b28ccbbbf664acf2a2471b65a1 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Tue, 7 Sep 2021 10:29:23 +0800 Subject: [PATCH 028/222] =?UTF-8?q?=E6=9B=B4=E6=96=B00530.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E7=BB=9D=E5=AF=B9=E5=80=BC=E5=B7=AE.md=E8=BF=AD=E4=BB=A3Java?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0530.二叉搜索树的最小绝对差.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/problems/0530.二叉搜索树的最小绝对差.md b/problems/0530.二叉搜索树的最小绝对差.md index db2ca2d4..b19a0dd2 100644 --- a/problems/0530.二叉搜索树的最小绝对差.md +++ b/problems/0530.二叉搜索树的最小绝对差.md @@ -184,15 +184,15 @@ class Solution { int result = Integer.MAX_VALUE; while (cur != null || !stack.isEmpty()) { if (cur != null) { - stack.push(cur); - cur = cur.left; // 左节点入栈 + stack.push(cur); // 将访问的节点放进栈 + cur = cur.left; // 左 }else { - cur = stack.pop(); // 右节点入栈 - if (pre != null) { + cur = stack.pop(); + if (pre != null) { // 中 result = Math.min(result, cur.val - pre.val); } pre = cur; - cur = cur.right; + cur = cur.right; // 右 } } return result; From 92980de383398d6540a48dcf648996df00726408 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Tue, 7 Sep 2021 11:28:50 +0800 Subject: [PATCH 029/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00501.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E4=BC=97?= =?UTF-8?q?=E6=95=B0.md=E8=BF=AD=E4=BB=A3Java=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0501.二叉搜索树中的众数.md | 38 ++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md index aeddc600..22d4f4ac 100644 --- a/problems/0501.二叉搜索树中的众数.md +++ b/problems/0501.二叉搜索树中的众数.md @@ -429,6 +429,44 @@ class Solution { } } ``` +迭代法 +```java +class Solution { + public int[] findMode(TreeNode root) { + TreeNode pre = null; + Stack stack = new Stack<>(); + List result = new ArrayList<>(); + int maxCount = 0; + int count = 0; + TreeNode cur = root; + while (cur != null || !stack.isEmpty()) { + if (cur != null) { + stack.push(cur); + cur =cur.left; + }else { + cur = stack.pop(); + // 计数 + if (pre == null || cur.val != pre.val) { + count = 1; + }else { + count++; + } + // 更新结果 + if (count > maxCount) { + maxCount = count; + result.clear(); + result.add(cur.val); + }else if (count == maxCount) { + result.add(cur.val); + } + pre = cur; + cur = cur.right; + } + } + return result.stream().mapToInt(Integer::intValue).toArray(); + } +} +``` ## Python From 41f2652d8677bbe97cd1fe7792415228f1032bb7 Mon Sep 17 00:00:00 2001 From: bourne-3 <595962708@qq.com> Date: Tue, 7 Sep 2021 12:13:27 +0800 Subject: [PATCH 030/222] =?UTF-8?q?=C2=96129=E6=B1=82=E6=A0=B9=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=9A=84=E5=8F=B6=E8=8A=82=E7=82=B9=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E4=B9=8B=E5=92=8CJava=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0129.求根到叶子节点数字之和.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md index 3439cd25..a330991e 100644 --- a/problems/0129.求根到叶子节点数字之和.md +++ b/problems/0129.求根到叶子节点数字之和.md @@ -164,6 +164,54 @@ public: Java: +```java +class Solution { + List path = new ArrayList<>(); + int res = 0; + + public int sumNumbers(TreeNode root) { + // 如果节点为0,那么就返回0 + if (root == null) return 0; + // 首先将根节点放到集合中 + path.add(root.val); + // 开始递归 + recur(root); + return res; + } + + public void recur(TreeNode root){ + if (root.left == null && root.right == null) { + // 当是叶子节点的时候,开始处理 + res += listToInt(path); + return; + } + + if (root.left != null){ + // 注意有回溯 + path.add(root.left.val); + recur(root.left); + path.remove(path.size() - 1); + } + if (root.right != null){ + // 注意有回溯 + path.add(root.right.val); + recur(root.right); + path.remove(path.size() - 1); + } + return; + } + + public int listToInt(List path){ + int sum = 0; + for (Integer num:path){ + // sum * 10 表示进位 + sum = sum * 10 + num; + } + return sum; + } +} +``` + Python: ```python3 class Solution: From 3d1843da4a89a2d0121bb3ebfc7365408fdae3b2 Mon Sep 17 00:00:00 2001 From: bourne-3 <595962708@qq.com> Date: Tue, 7 Sep 2021 12:20:01 +0800 Subject: [PATCH 031/222] =?UTF-8?q?=C2=96129=E6=B1=82=E6=A0=B9=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=9A=84=E5=8F=B6=E8=8A=82=E7=82=B9=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E4=B9=8B=E5=92=8CJava=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0129.求根到叶子节点数字之和.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md index a330991e..7f50c885 100644 --- a/problems/0129.求根到叶子节点数字之和.md +++ b/problems/0129.求根到叶子节点数字之和.md @@ -168,7 +168,6 @@ Java: class Solution { List path = new ArrayList<>(); int res = 0; - public int sumNumbers(TreeNode root) { // 如果节点为0,那么就返回0 if (root == null) return 0; @@ -200,7 +199,6 @@ class Solution { } return; } - public int listToInt(List path){ int sum = 0; for (Integer num:path){ From b5b7437a5516382eb3410184a26fa33045814548 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Tue, 7 Sep 2021 14:04:28 +0800 Subject: [PATCH 032/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00235.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E7=A5=96=E5=85=88.md=E9=80=92=E5=BD=92Java?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0235.二叉搜索树的最近公共祖先.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/problems/0235.二叉搜索树的最近公共祖先.md b/problems/0235.二叉搜索树的最近公共祖先.md index 929e6eb2..25bbf7e4 100644 --- a/problems/0235.二叉搜索树的最近公共祖先.md +++ b/problems/0235.二叉搜索树的最近公共祖先.md @@ -234,7 +234,15 @@ public: ## Java 递归法: - +```java +class Solution { + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q); + if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q); + return root; + } +} +``` 迭代法: ```java From 4d91c78e1ea6e1d51a5a73b825762cf6097a1e96 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+GHumorBS@users.noreply.github.com> Date: Tue, 7 Sep 2021 17:00:25 +0800 Subject: [PATCH 033/222] =?UTF-8?q?Update=200406.=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E8=BA=AB=E9=AB=98=E9=87=8D=E5=BB=BA=E9=98=9F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充一下python注释,更好理解python语法 --- problems/0406.根据身高重建队列.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md index 6d8f703b..bd27b1b2 100644 --- a/problems/0406.根据身高重建队列.md +++ b/problems/0406.根据身高重建队列.md @@ -209,8 +209,13 @@ Python: ```python class Solution: def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]: + # 先按照h维度的身高顺序从高到低排序。确定第一个维度 + # lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序 people.sort(key=lambda x: (-x[0], x[1])) que = [] + + # 根据每个元素的第二个维度k,贪心算法,进行插入 + # people已经排序过了:同一高度时k值小的排前面。 for p in people: que.insert(p[1], p) return que From d52cb2aa4901be727d077c2aaf3aafd9ed0519ee Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Tue, 7 Sep 2021 21:47:41 +0800 Subject: [PATCH 034/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00450.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E8=8A=82=E7=82=B9.mdJava=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0450.删除二叉搜索树中的节点.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index 35c8e24d..6b8ab7ed 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -278,6 +278,33 @@ class Solution { } } ``` +```java +// 解法2 +class Solution { + public TreeNode deleteNode(TreeNode root, int key) { + if (root == null) return root; + if (root.val == key) { + if (root.left == null) { + return root.right; + } + else if (root.right == null) { + return root.left; + } + else{ + TreeNode cur = root.right; + while (cur.left != null) { + cur = cur.left; + } + cur.left = root.left; + root = root.right; + return root; + } + } + if (root.val > key) root.left = deleteNode(root.left, key); + if (root.val < key) root.right = deleteNode(root.right, key); + return root; + } +``` ## Python From 6a6d6f993aa496788325d1f4bb0d95c44ede202b Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Tue, 7 Sep 2021 21:48:13 +0800 Subject: [PATCH 035/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00450.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E8=8A=82=E7=82=B9.mdJava=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0450.删除二叉搜索树中的节点.md | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index 6b8ab7ed..f11431e0 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -281,29 +281,28 @@ class Solution { ```java // 解法2 class Solution { - public TreeNode deleteNode(TreeNode root, int key) { - if (root == null) return root; - if (root.val == key) { - if (root.left == null) { - return root.right; - } - else if (root.right == null) { - return root.left; - } - else{ - TreeNode cur = root.right; - while (cur.left != null) { - cur = cur.left; - } - cur.left = root.left; - root = root.right; - return root; - } + public TreeNode deleteNode(TreeNode root, int key) { + if (root == null) return root; + if (root.val == key) { + if (root.left == null) { + return root.right; + } else if (root.right == null) { + return root.left; + } else { + TreeNode cur = root.right; + while (cur.left != null) { + cur = cur.left; } - if (root.val > key) root.left = deleteNode(root.left, key); - if (root.val < key) root.right = deleteNode(root.right, key); + cur.left = root.left; + root = root.right; return root; + } } + if (root.val > key) root.left = deleteNode(root.left, key); + if (root.val < key) root.right = deleteNode(root.right, key); + return root; + } +} ``` ## Python From 995aa86ab2eb21559bcdd0d3cc91e486e33cade1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Wed, 8 Sep 2021 13:28:04 +0800 Subject: [PATCH 036/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E7=AC=AC18?= =?UTF-8?q?=E9=A2=98.=20=E5=9B=9B=E6=95=B0=E4=B9=8B=E5=92=8C=20Swift?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0018.四数之和.md | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index c81c5df7..9891f0fe 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -354,6 +354,54 @@ class Solution { } ``` +Swift: +```swift +func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { + var res = [[Int]]() + var sorted = nums + sorted.sort() + for k in 0 ..< sorted.count { + // 这种剪枝不行,target可能是负数 +// if sorted[k] > target { +// return res +// } + // 去重 + if k > 0 && sorted[k] == sorted[k - 1] { + continue + } + + let target2 = target - sorted[k] + for i in (k + 1) ..< sorted.count { + if i > (k + 1) && sorted[i] == sorted[i - 1] { + continue + } + var left = i + 1 + var right = sorted.count - 1 + while left < right { + let sum = sorted[i] + sorted[left] + sorted[right] + if sum < target2 { + left += 1 + } else if sum > target2 { + right -= 1 + } else { + res.append([sorted[k], sorted[i], sorted[left], sorted[right]]) + while left < right && sorted[left] == sorted[left + 1] { + left += 1 + } + while left < right && sorted[right] == sorted[right - 1] { + right -= 1 + } + // 找到答案 双指针同时收缩 + left += 1 + right -= 1 + } + } + } + } + return res +} +``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From 8df256e8dc58812274009ef5fd8bad90d31a8f21 Mon Sep 17 00:00:00 2001 From: baici1 <249337001@qq.com> Date: Wed, 8 Sep 2021 19:18:02 +0800 Subject: [PATCH 037/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0104=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6?= =?UTF-8?q?=E7=9A=84go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 36 ++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index ac43f0a5..598e274f 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1570,9 +1570,43 @@ class Solution: return len(result) ``` - Go: +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func maxDepth(root *TreeNode) int { + ans:=0 + if root==nil{ + return 0 + } + queue:=list.New() + queue.PushBack(root) + for queue.Len()>0{ + length:=queue.Len() + for i:=0;i Date: Wed, 8 Sep 2021 19:20:34 +0800 Subject: [PATCH 038/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0111.=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6?= =?UTF-8?q?=20go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 40 +++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 598e274f..a2fd6f03 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1708,6 +1708,46 @@ class Solution: Go: +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func minDepth(root *TreeNode) int { + ans:=0 + if root==nil{ + return 0 + } + queue:=list.New() + queue.PushBack(root) + for queue.Len()>0{ + length:=queue.Len() + for i:=0;i Date: Wed, 8 Sep 2021 22:17:37 +0800 Subject: [PATCH 039/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200416.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86=20go=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0416.分割等和子集 go版本 --- problems/0416.分割等和子集.md | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index 599a3180..415ff88b 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -227,6 +227,45 @@ class Solution: ``` Go: +``` +func canPartition(nums []int) bool { + /** + 动态五部曲: + 1.确定dp数组和下标含义 + 2.确定递推公式 + 3.dp数组初始化 + 4.dp遍历顺序 + 5.打印 + **/ + //确定和 + var sum int + for _,v:=range nums{ + sum+=v + } + if sum%2!=0{ //如果和为奇数,则不可能分成两个相等的数组 + return false + } + sum/=2 + //确定dp数组和下标含义 + var dp [][]bool //dp[i][j] 表示: 前i个石头是否总和不大于J + //初始化数组 + dp=make([][]bool,len(nums)+1) + for i,_:=range dp{ + dp[i]=make([]bool,sum+1) + dp[i][0]=true + } + for i:=1;i<=len(nums);i++{ + for j:=1;j<=sum;j++{//j是固定总量 + if j>=nums[i-1]{//如果容量够用则可放入背包 + dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i-1]] + }else{//如果容量不够用则不拿,维持前一个状态 + dp[i][j]=dp[i-1][j] + } + } + } + return dp[len(nums)][sum] +} +``` javaScript: From 3c46136f6612e8502baeb6790ccf8856ffb32894 Mon Sep 17 00:00:00 2001 From: martisss <2466632626@qq.com> Date: Thu, 9 Sep 2021 10:41:29 +0800 Subject: [PATCH 040/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0134.=E5=8A=A0?= =?UTF-8?q?=E6=B2=B9=E7=AB=99=20js=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0134.加油站.md | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md index 9aa88fce..526efb14 100644 --- a/problems/0134.加油站.md +++ b/problems/0134.加油站.md @@ -281,6 +281,48 @@ func canCompleteCircuit(gas []int, cost []int) int { ``` Javascript: +暴力: +```js +var canCompleteCircuit = function(gas, cost) { + for(let i = 0; i < cost.length; i++) { + let rest = gas[i] - cost[i] //记录剩余油量 + // 以i为起点行驶一圈,index为下一个目的地 + let index = (i + 1) % cost.length + while(rest > 0 && index !== i) { + rest += gas[index] - cost[index] + index = (index + 1) % cost.length + } + if(rest >= 0 && index === i) return i + } + return -1 +}; +``` +解法一: +```js +var canCompleteCircuit = function(gas, cost) { + let curSum = 0 + let min = Infinity + for(let i = 0; i < gas.length; i++) { + let rest = gas[i] - cost[i] + curSum += rest + if(curSum < min) { + min = curSum + } + } + if(curSum < 0) return -1 //1.总油量 小于 总消耗量 + if(min >= 0) return 0 //2. 说明油箱里油没断过 + //3. 从后向前,看哪个节点能这个负数填平,能把这个负数填平的节点就是出发节点 + for(let i = gas.length -1; i >= 0; i--) { + let rest = gas[i] - cost[i] + min += rest + if(min >= 0) { + return i + } + } + return -1 +} +``` +解法二: ```Javascript var canCompleteCircuit = function(gas, cost) { const gasLen = gas.length From 04e4a6ea6b1ed250b7d7e64c0c87071736568524 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+GHumorBS@users.noreply.github.com> Date: Thu, 9 Sep 2021 13:34:16 +0800 Subject: [PATCH 041/222] =?UTF-8?q?Update=200968.=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完善python代码,补充comment理解 --- problems/0968.监控二叉树.md | 51 ++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/problems/0968.监控二叉树.md b/problems/0968.监控二叉树.md index a5fa71a7..384c9a78 100644 --- a/problems/0968.监控二叉树.md +++ b/problems/0968.监控二叉树.md @@ -347,24 +347,57 @@ class Solution { Python: ```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right class Solution: def minCameraCover(self, root: TreeNode) -> int: + # Greedy Algo: + # 从下往上安装摄像头:跳过leaves这样安装数量最少,局部最优 -> 全局最优 + # 先给leaves的父节点安装,然后每隔两层节点安装一个摄像头,直到Head + # 0: 该节点未覆盖 + # 1: 该节点有摄像头 + # 2: 该节点有覆盖 + result = 0 - def traversal(cur): + # 从下往上遍历:后序(左右中) + def traversal(curr: TreeNode) -> int: nonlocal result - if not cur: - return 2 - left = traversal(cur.left) - right = traversal(cur.right) - if left == 2 and right == 2: + + if not curr: return 2 + left = traversal(curr.left) + right = traversal(curr.right) + + # Case 1: + # 左右节点都有覆盖 + if left == 2 and right == 2: return 0 - elif left == 0 or right == 0: + + # Case 2: + # left == 0 && right == 0 左右节点无覆盖 + # left == 1 && right == 0 左节点有摄像头,右节点无覆盖 + # left == 0 && right == 1 左节点有无覆盖,右节点摄像头 + # left == 0 && right == 2 左节点无覆盖,右节点覆盖 + # left == 2 && right == 0 左节点覆盖,右节点无覆盖 + elif left == 0 or right == 0: result += 1 return 1 + + # Case 3: + # left == 1 && right == 2 左节点有摄像头,右节点有覆盖 + # left == 2 && right == 1 左节点有覆盖,右节点有摄像头 + # left == 1 && right == 1 左右节点都有摄像头 elif left == 1 or right == 1: return 2 - else: return -1 - if traversal(root) == 0: result += 1 + + # 其他情况前段代码均已覆盖 + + if traversal(root) == 0: + result += 1 + return result ``` Go: From 09013df96a8263dda2ed601acc04e69107ff2b46 Mon Sep 17 00:00:00 2001 From: baici1 <249337001@qq.com> Date: Thu, 9 Sep 2021 15:52:45 +0800 Subject: [PATCH 042/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0226=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=90=E6=A0=91=20go=E7=89=88=E6=9C=AC=E7=9A=84=E9=80=92?= =?UTF-8?q?=E5=BD=92=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=EF=BC=8C=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=E5=89=8D=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=EF=BC=8C?= =?UTF-8?q?=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0226.翻转二叉树.md | 94 +++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/problems/0226.翻转二叉树.md b/problems/0226.翻转二叉树.md index b69cad55..fb5d831a 100644 --- a/problems/0226.翻转二叉树.md +++ b/problems/0226.翻转二叉树.md @@ -363,7 +363,9 @@ class Solution: return root ``` -### Go +### Go + +递归版本的前序遍历 ```Go func invertTree(root *TreeNode) *TreeNode { @@ -381,6 +383,96 @@ func invertTree(root *TreeNode) *TreeNode { } ``` +递归版本的后序遍历 + +```go +func invertTree(root *TreeNode) *TreeNode { + if root==nil{ + return root + } + invertTree(root.Left)//遍历左节点 + invertTree(root.Right)//遍历右节点 + root.Left,root.Right=root.Right,root.Left//交换 + return root +} +``` + +迭代版本的前序遍历 + +```go +func invertTree(root *TreeNode) *TreeNode { + stack:=[]*TreeNode{} + node:=root + for node!=nil||len(stack)>0{ + for node!=nil{ + node.Left,node.Right=node.Right,node.Left//交换 + stack=append(stack,node) + node=node.Left + } + node=stack[len(stack)-1] + stack=stack[:len(stack)-1] + node=node.Right + } + return root +} +``` + +迭代版本的后序遍历 + +```go +func invertTree(root *TreeNode) *TreeNode { + stack:=[]*TreeNode{} + node:=root + var prev *TreeNode + for node!=nil||len(stack)>0{ + for node!=nil{ + stack=append(stack,node) + node=node.Left + } + node=stack[len(stack)-1] + stack=stack[:len(stack)-1] + if node.Right==nil||node.Right==prev{ + node.Left,node.Right=node.Right,node.Left//交换 + prev=node + node=nil + }else { + stack=append(stack,node) + node=node.Right + } + } + return root +} +``` + +层序遍历 + +```go +func invertTree(root *TreeNode) *TreeNode { + if root==nil{ + return root + } + queue:=list.New() + node:=root + queue.PushBack(node) + for queue.Len()>0{ + length:=queue.Len() + for i:=0;i Date: Thu, 9 Sep 2021 22:15:15 +0800 Subject: [PATCH 043/222] Update --- README.md | 6 +- problems/0059.螺旋矩阵II.md | 3 +- ...将有序数组转换为二叉搜索树.md | 52 ++------ problems/0377.组合总和Ⅳ.md | 1 + ...38.把二叉搜索树转换为累加树.md | 75 ++++------- problems/1221.分割平衡字符串.md | 118 ++++++++++++++++++ .../不少录友想放弃秋招.md | 1 + .../专业技能可以这么写.md | 1 + .../写简历的一些问题.md | 2 +- .../博士转行计算机.md | 1 + .../知识星球精选/备战2022届秋招.md | 1 + .../背包问题理论基础多重背包.md | 2 + 12 files changed, 164 insertions(+), 99 deletions(-) create mode 100644 problems/1221.分割平衡字符串.md diff --git a/README.md b/README.md index fa1b603b..96f7bb9c 100644 --- a/README.md +++ b/README.md @@ -122,11 +122,6 @@ * [递归算法的时间与空间复杂度分析!](./problems/前序/递归算法的时间与空间复杂度分析.md) * [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md) -## 社群 - -* [准备校招的录友们,组织在这里!](https://mp.weixin.qq.com/s/5vKadlE1g2HjDpo2-y2ZFw) -* [准备社招的录友们,组织在这里!](https://mp.weixin.qq.com/s/mbQ3s17ZJ4LXFRb-VD58Ww) - ## 知识星球精选 * [为什么都说客户端会消失](./problems/知识星球精选/客三消.md) @@ -488,6 +483,7 @@ ## 贪心 * [649.Dota2参议院](./problems/0649.Dota2参议院.md) 有难度 +* [1221.分割平衡字符](./problems/1221.分割平衡字符串.md) 简单贪心 ## 动态规划 * [5.最长回文子串](./problems/0005.最长回文子串.md) 和[647.回文子串](https://mp.weixin.qq.com/s/2WetyP6IYQ6VotegepVpEw) 差不多是一样的 diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 3dbc2a50..fbac50ac 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -11,7 +11,8 @@ ## 59.螺旋矩阵II [力扣题目链接](https://leetcode-cn.com/problems/spiral-matrix-ii/) -给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 + +给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: diff --git a/problems/0108.将有序数组转换为二叉搜索树.md b/problems/0108.将有序数组转换为二叉搜索树.md index 5f99f98a..f7bff27d 100644 --- a/problems/0108.将有序数组转换为二叉搜索树.md +++ b/problems/0108.将有序数组转换为二叉搜索树.md @@ -9,7 +9,7 @@ > 构造二叉搜索树,一不小心就平衡了 -## 108.将有序数组转换为二叉搜索树 +# 108.将有序数组转换为二叉搜索树 [力扣题目链接](https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/) @@ -21,7 +21,7 @@ ![108.将有序数组转换为二叉搜索树](https://img-blog.csdnimg.cn/20201022164420763.png) -## 思路 +# 思路 做这道题目之前大家可以了解一下这几道: @@ -192,7 +192,7 @@ public: }; ``` -## 总结 +# 总结 **在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 和 [二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)之后,我们顺理成章的应该构造一下二叉搜索树了,一不小心还是一棵平衡二叉搜索树**。 @@ -205,10 +205,10 @@ public: 最后依然给出迭代的方法,其实就是模拟取中间元素,然后不断分割去构造二叉树的过程。 -## 其他语言版本 +# 其他语言版本 -Java: +## Java 递归: 左闭右开 [left,right) ```Java @@ -253,7 +253,8 @@ class Solution { return root; } } -``` +``` + 迭代: 左闭右闭 [left,right] ```java class Solution { @@ -303,15 +304,10 @@ class Solution { } ``` -Python: +## Python + +递归法: ```python3 -# Definition for a binary tree node. -# class TreeNode: -# def __init__(self, val=0, left=None, right=None): -# self.val = val -# self.left = left -# self.right = right -#递归法 class Solution: def sortedArrayToBST(self, nums: List[int]) -> TreeNode: def buildaTree(left,right): @@ -326,21 +322,11 @@ class Solution: return root ``` -Go: +## Go - -> 递归(隐含回溯) +递归(隐含回溯) ```go -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - //递归(隐含回溯) func sortedArrayToBST(nums []int) *TreeNode { if len(nums)==0{return nil}//终止条件,最后数组为空则可以返回 root:=&TreeNode{nums[len(nums)/2],nil,nil}//按照BSL的特点,从中间构造节点 @@ -350,21 +336,9 @@ func sortedArrayToBST(nums []int) *TreeNode { } ``` -JavaScript版本 +## JavaScript ```javascript -/** - * Definition for a binary tree node. - * function TreeNode(val, left, right) { - * this.val = (val===undefined ? 0 : val) - * this.left = (left===undefined ? null : left) - * this.right = (right===undefined ? null : right) - * } - */ -/** - * @param {number[]} nums - * @return {TreeNode} - */ var sortedArrayToBST = function (nums) { const buildTree = (Arr, left, right) => { if (left > right) diff --git a/problems/0377.组合总和Ⅳ.md b/problems/0377.组合总和Ⅳ.md index 47e81af6..01f48d45 100644 --- a/problems/0377.组合总和Ⅳ.md +++ b/problems/0377.组合总和Ⅳ.md @@ -5,6 +5,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 动态规划:Carl称它为排列总和! ## 377. 组合总和 Ⅳ diff --git a/problems/0538.把二叉搜索树转换为累加树.md b/problems/0538.把二叉搜索树转换为累加树.md index df22511d..24fc7211 100644 --- a/problems/0538.把二叉搜索树转换为累加树.md +++ b/problems/0538.把二叉搜索树转换为累加树.md @@ -7,7 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 538.把二叉搜索树转换为累加树 +# 538.把二叉搜索树转换为累加树 [力扣题目链接](https://leetcode-cn.com/problems/convert-bst-to-greater-tree/) @@ -23,20 +23,20 @@ ![538.把二叉搜索树转换为累加树](https://img-blog.csdnimg.cn/20201023160751832.png) -输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] -输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8] +* 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] +* 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8] 示例 2: -输入:root = [0,null,1] -输出:[1,null,1] +* 输入:root = [0,null,1] +* 输出:[1,null,1] 示例 3: -输入:root = [1,0,2] -输出:[3,3,2] +* 输入:root = [1,0,2] +* 输出:[3,3,2] 示例 4: -输入:root = [3,2,4,1] -输出:[7,9,4,10] +* 输入:root = [3,2,4,1] +* 输出:[7,9,4,10] 提示: @@ -45,7 +45,7 @@ * 树中的所有值 互不相同 。 * 给定的树为二叉搜索树。 -## 思路 +# 思路 一看到累加树,相信很多小伙伴都会疑惑:如何累加?遇到一个节点,然后在遍历其他节点累加?怎么一想这么麻烦呢。 @@ -162,17 +162,17 @@ public: }; ``` -## 总结 +# 总结 经历了前面各种二叉树增删改查的洗礼之后,这道题目应该比较简单了。 **好了,二叉树已经接近尾声了,接下来就是要对二叉树来一个大总结了**。 -## 其他语言版本 +# 其他语言版本 -Java: +## Java ```Java class Solution { int sum; @@ -195,15 +195,10 @@ class Solution { } ``` -Python: -```python3 -# Definition for a binary tree node. -# class TreeNode: -# def __init__(self, val=0, left=None, right=None): -# self.val = val -# self.left = left -# self.right = right -#递归法 +## Python + +递归法 +```python class Solution: def convertBST(self, root: TreeNode) -> TreeNode: def buildalist(root): @@ -216,10 +211,10 @@ class Solution: buildalist(root) return root ``` -Go: +## Go -> 弄一个sum暂存其和值 +弄一个sum暂存其和值 ```go //右中左 @@ -239,23 +234,10 @@ func RightMLeft(root *TreeNode,sum *int) *TreeNode { } ``` -JavaScript版本 - -> 递归 +## JavaScript +递归 ```javascript -/** - * Definition for a binary tree node. - * function TreeNode(val, left, right) { - * this.val = (val===undefined ? 0 : val) - * this.left = (left===undefined ? null : left) - * this.right = (right===undefined ? null : right) - * } - */ -/** - * @param {TreeNode} root - * @return {TreeNode} - */ var convertBST = function(root) { let pre = 0; const ReverseInOrder = (cur) => { @@ -271,21 +253,8 @@ var convertBST = function(root) { }; ``` -> 迭代 - +迭代 ```javascript -/** - * Definition for a binary tree node. - * function TreeNode(val, left, right) { - * this.val = (val===undefined ? 0 : val) - * this.left = (left===undefined ? null : left) - * this.right = (right===undefined ? null : right) - * } - */ -/** - * @param {TreeNode} root - * @return {TreeNode} - */ var convertBST = function (root) { let pre = 0; let cur = root; diff --git a/problems/1221.分割平衡字符串.md b/problems/1221.分割平衡字符串.md new file mode 100644 index 00000000..c764e3ff --- /dev/null +++ b/problems/1221.分割平衡字符串.md @@ -0,0 +1,118 @@ +

+ + + + +

+

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ +# 1221. 分割平衡字符串 + +[力扣题目链接](https://leetcode-cn.com/problems/split-a-string-in-balanced-strings/) + +在一个 平衡字符串 中,'L' 和 'R' 字符的数量是相同的。 + +给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。 + +注意:分割得到的每个字符串都必须是平衡字符串。 + +返回可以通过分割得到的平衡字符串的 最大数量 。 + + +示例 1: + +* 输入:s = "RLRRLLRLRL" +* 输出:4 +* 解释:s 可以分割为 "RL"、"RRLL"、"RL"、"RL" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。 + +示例 2: +* 输入:s = "RLLLLRRRLR" +* 输出:3 +* 解释:s 可以分割为 "RL"、"LLLRRR"、"LR" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。 + +示例 3: +* 输入:s = "LLLLRRRR" +* 输出:1 +* 解释:s 只能保持原样 "LLLLRRRR". + +示例 4: +* 输入:s = "RLRRRLLRLL" +* 输出:2 +* 解释:s 可以分割为 "RL"、"RRRLLRLL" ,每个子字符串中都包含相同数量的 'L' 和 'R' 。 + +# 思路 + +这道题目看起来好像很复杂,其实是非常简单的贪心,关于贪心,我在这里[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)有详细的讲解。 + +从前向后遍历,只要遇到平衡子串,计数就+1,遍历一遍即可。 + +局部最优:从前向后遍历,只要遇到平衡子串 就统计 + +全局最优:统计了最多的平衡子串。 + +局部最优可以推出全局最优,举不出反例,那么就试试贪心。 + + +例如,LRLR 这本身就是平衡子串 , 但要遇到LR就可以分割。 + +C++代码如下: + +```CPP +class Solution { +public: + int balancedStringSplit(string s) { + int result = 0; + int count = 0; + for (int i = 0; i < s.size(); i++) { + if (s[i] == 'R') count++; + else count--; + if (count == 0) result++; + } + return result; + } +}; +``` + +# 拓展 + +一些同学可能想,你这个推理不靠谱,都没有数学证明。怎么就能说是合理的呢,怎么就能说明 局部最优可以推出全局最优呢? + +一般数学证明有如下两种方法: + +* 数学归纳法 +* 反证法 + +如果真的去严格数学证明其实不是在我们刷题或者 面试的考察范围内了。 + +所以贪心题目的思考过程是: 如果发现局部最优好像可以推出全局最优,那么就 尝试一下举反例,如果举不出反例,那么就试试贪心。 + + + +# 其他语言版本 + +## Java + +```java +``` + +## Python + +```python +``` + +## Go + +```go +``` + +## JavaScript + +```js +``` + +----------------------- +* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) +* B站视频:[代码随想录](https://space.bilibili.com/525438321) +* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) + +
diff --git a/problems/知识星球精选/不少录友想放弃秋招.md b/problems/知识星球精选/不少录友想放弃秋招.md index 37fd0d3d..4807dd97 100644 --- a/problems/知识星球精选/不少录友想放弃秋招.md +++ b/problems/知识星球精选/不少录友想放弃秋招.md @@ -1,3 +1,4 @@ +# 不少录友想放弃秋招了..... 马上就要九月份了,互联网大厂的秋招的序幕早已拉开。 diff --git a/problems/知识星球精选/专业技能可以这么写.md b/problems/知识星球精选/专业技能可以这么写.md index cf7cdff7..51522b9f 100644 --- a/problems/知识星球精选/专业技能可以这么写.md +++ b/problems/知识星球精选/专业技能可以这么写.md @@ -1,3 +1,4 @@ +# 你简历里的「专业技能」写的够专业么? 其实我几乎每天都要看一些简历,有一些写的不错的,我都会在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里分享一下。 diff --git a/problems/知识星球精选/写简历的一些问题.md b/problems/知识星球精选/写简历的一些问题.md index 2ebfbe51..513f86ba 100644 --- a/problems/知识星球精选/写简历的一些问题.md +++ b/problems/知识星球精选/写简历的一些问题.md @@ -1,4 +1,4 @@ - +# 程序员应该这么写简历! 自运营[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 diff --git a/problems/知识星球精选/博士转行计算机.md b/problems/知识星球精选/博士转行计算机.md index e8431318..cb73804e 100644 --- a/problems/知识星球精选/博士转行计算机.md +++ b/problems/知识星球精选/博士转行计算机.md @@ -1,3 +1,4 @@ +# 本硕非计算机博士,如果找计算机相关工作 在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 diff --git a/problems/知识星球精选/备战2022届秋招.md b/problems/知识星球精选/备战2022届秋招.md index c48688e8..383f5742 100644 --- a/problems/知识星球精选/备战2022届秋招.md +++ b/problems/知识星球精选/备战2022届秋招.md @@ -1,3 +1,4 @@ +# 要开始准备2022届的秋招了 在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 diff --git a/problems/背包问题理论基础多重背包.md b/problems/背包问题理论基础多重背包.md index f1dfed26..a2ef88a4 100644 --- a/problems/背包问题理论基础多重背包.md +++ b/problems/背包问题理论基础多重背包.md @@ -5,6 +5,8 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + # 动态规划:关于多重背包,你该了解这些! 之前我们已经体统的讲解了01背包和完全背包,如果没有看过的录友,建议先把如下三篇文章仔细阅读一波。 From c6ae3884f6449f9f68e1e956a12ef0b23be8a3f1 Mon Sep 17 00:00:00 2001 From: ironartisan <54694467+ironartisan@users.noreply.github.com> Date: Fri, 10 Sep 2021 14:32:36 +0800 Subject: [PATCH 044/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0121.=E4=B9=B0?= =?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6?= =?UTF-8?q?=E6=9C=BA.mdJava=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0121.买卖股票的最佳时机.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/problems/0121.买卖股票的最佳时机.md b/problems/0121.买卖股票的最佳时机.md index daeb05a9..b08e4193 100644 --- a/problems/0121.买卖股票的最佳时机.md +++ b/problems/0121.买卖股票的最佳时机.md @@ -214,6 +214,26 @@ class Solution { } } ``` +```java +// 解法1 +class Solution { + public int maxProfit(int[] prices) { + if (prices == null || prices.length == 0) return 0; + int length = prices.length; + // dp[i][0]代表第i天持有股票的最大收益 + // dp[i][1]代表第i天不持有股票的最大收益 + int[][] dp = new int[length][2]; + int result = 0; + dp[0][0] = -prices[0]; + dp[0][1] = 0; + for (int i = 1; i < length; i++) { + dp[i][0] = Math.max(dp[i - 1][0], -prices[i]); + dp[i][1] = Math.max(dp[i - 1][0] + prices[i], dp[i - 1][1]); + } + return dp[length - 1][1]; + } +} +``` ``` java class Solution { // 动态规划解法 From c33f8452a881236e5fabc09fb5c30a0c962cd593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Fri, 10 Sep 2021 17:21:54 +0800 Subject: [PATCH 045/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20344.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0344.反转字符串.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/problems/0344.反转字符串.md b/problems/0344.反转字符串.md index a5f18d58..a02c27d5 100644 --- a/problems/0344.反转字符串.md +++ b/problems/0344.反转字符串.md @@ -206,6 +206,7 @@ var reverseString = function(s) { Swift: ```swift +// 双指针 - 元组 func reverseString(_ s: inout [Character]) { var l = 0 var r = s.count - 1 @@ -216,11 +217,18 @@ func reverseString(_ s: inout [Character]) { r -= 1 } } + +// 双指针法 - 库函数 +func reverseString(_ s: inout [Character]) { + var j = s.count - 1 + for i in 0 ..< Int(Double(s.count) * 0.5) { + s.swapAt(i, j) + j -= 1 + } +} ``` - - ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From a4074220b3ab959e151f429ea7249911d46721be Mon Sep 17 00:00:00 2001 From: martisss <2466632626@qq.com> Date: Sat, 11 Sep 2021 16:52:49 +0800 Subject: [PATCH 046/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0435.=E6=97=A0?= =?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4=20js=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0435.无重叠区间.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index ae037f17..4e850114 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -274,6 +274,7 @@ func min(a,b int)int{ } ``` Javascript: +- 按右边界排序 ```Javascript var eraseOverlapIntervals = function(intervals) { intervals.sort((a, b) => { @@ -285,7 +286,7 @@ var eraseOverlapIntervals = function(intervals) { for(let i = 1; i < intervals.length; i++) { let interval = intervals[i] - if(interval[0] >= right) { + if(interval[0] >= end) { end = interval[1] count += 1 } @@ -294,6 +295,24 @@ var eraseOverlapIntervals = function(intervals) { return intervals.length - count }; ``` +- 按左边界排序 +```js +var eraseOverlapIntervals = function(intervals) { + // 按照左边界升序排列 + intervals.sort((a, b) => a[0] - b[0]) + let count = 1 + let end = intervals[intervals.length - 1][0] + // 倒序遍历,对单个区间来说,左边界越大越好,因为给前面区间的空间越大 + for(let i = intervals.length - 2; i >= 0; i--) { + if(intervals[i][1] <= end) { + count++ + end = intervals[i][0] + } + } + // count 记录的是最大非重复区间的个数 + return intervals.length - count +} +``` ----------------------- From 33fdd706765de8d794af88b6d2681909f855a1c6 Mon Sep 17 00:00:00 2001 From: YiChih Wang Date: Sun, 12 Sep 2021 12:19:33 +0800 Subject: [PATCH 047/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A00242.=E6=9C=89?= =?UTF-8?q?=E6=95=88=E7=9A=84=E5=AD=97=E6=AF=8D=E5=BC=82=E4=BD=8D=E8=AF=8D?= =?UTF-8?q?Rust=E8=AA=9E=E8=A8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: - leetcode提交測試通過 --- problems/0242.有效的字母异位词.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/problems/0242.有效的字母异位词.md b/problems/0242.有效的字母异位词.md index 3416ac06..0828d360 100644 --- a/problems/0242.有效的字母异位词.md +++ b/problems/0242.有效的字母异位词.md @@ -256,6 +256,25 @@ class Solution { } ``` +Rust: +```rust +impl Solution { + pub fn is_anagram(s: String, t: String) -> bool { + let mut record = vec![0; 26]; + + let baseChar = 'a'; + + for byte in s.bytes() { + record[byte as usize - baseChar as usize] += 1; + } + for byte in t.bytes() { + record[byte as usize - baseChar as usize] -= 1; + } + + record.iter().filter(|x| **x != 0).count() == 0 + } +} +``` ## 相关题目 * 383.赎金信 From c7f68825e7a27499f4959f8c6d25d444a36b8227 Mon Sep 17 00:00:00 2001 From: YiChih Wang Date: Sun, 12 Sep 2021 13:49:39 +0800 Subject: [PATCH 048/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A00349.=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86Rust?= =?UTF-8?q?=E8=AA=9E=E8=A8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: - leetcode提交通過 --- problems/0349.两个数组的交集.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 0cbdf85f..28867092 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -238,6 +238,25 @@ class Solution { } ``` +Rust: +```rust +use std::collections::HashSet; +impl Solution { + pub fn intersection(nums1: Vec, nums2: Vec) -> Vec { + let mut resultSet: HashSet = HashSet::with_capacity(1000); + let nums1Set: HashSet = nums1.into_iter().collect(); + + for num in nums2.iter() { + if nums1Set.contains(num) { + resultSet.insert(*num); + } + } + + let ret: Vec = resultSet.into_iter().collect(); + ret + } +} +``` ## 相关题目 * 350.两个数组的交集 II From ac4fec799bebbe2cbabf8ee54a73ea89680dad6c Mon Sep 17 00:00:00 2001 From: YiChih Wang Date: Sun, 12 Sep 2021 16:27:39 +0800 Subject: [PATCH 049/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A00454.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E7=9B=B8=E5=8A=A0II=20Rust=E8=AA=9E=E8=A8=80=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: - leetcode上提交通過 --- problems/0454.四数相加II.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0454.四数相加II.md b/problems/0454.四数相加II.md index a82c617b..475f93a0 100644 --- a/problems/0454.四数相加II.md +++ b/problems/0454.四数相加II.md @@ -282,6 +282,31 @@ func fourSumCount(_ nums1: [Int], _ nums2: [Int], _ nums3: [Int], _ nums4: [Int] } ``` +Rust: +```rust +use std::collections::HashMap; +impl Solution { + pub fn four_sum_count(nums1: Vec, nums2: Vec, nums3: Vec, nums4: Vec) -> i32 { + let mut umap:HashMap = HashMap::new(); + for num1 in &nums1 { + for num2 in &nums2 { + *umap.entry(num1 + num2).or_insert(0) += 1; + } + } + + let mut count = 0; + + for num3 in &nums3 { + for num4 in &nums4 { + let target:i32 = - (num3 + num4); + count += umap.get(&target).unwrap_or(&0); + } + } + + count + } +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 1840a8aa3502e84e124d5d967ea417562690aa16 Mon Sep 17 00:00:00 2001 From: YiChih Wang Date: Sun, 12 Sep 2021 16:53:38 +0800 Subject: [PATCH 050/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A00383.=E8=B5=8E?= =?UTF-8?q?=E9=87=91=E4=BF=A1Rust=E8=AA=9E=E8=A8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: - leetcode提交通過 --- problems/0383.赎金信.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md index d1594015..75b31698 100644 --- a/problems/0383.赎金信.md +++ b/problems/0383.赎金信.md @@ -315,6 +315,28 @@ func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool { } ``` +Rust: +```rust +impl Solution { + pub fn can_construct(ransom_note: String, magazine: String) -> bool { + let baseChar = 'a'; + let mut record = vec![0; 26]; + + for byte in magazine.bytes() { + record[byte as usize - baseChar as usize] += 1; + } + + for byte in ransom_note.bytes() { + record[byte as usize - baseChar as usize] -= 1; + if record[byte as usize - baseChar as usize] < 0 { + return false; + } + } + + return true; + } +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From ac1de7ea4639b067310b2fb433adbda40a9b2795 Mon Sep 17 00:00:00 2001 From: DoubleYellowIce <65336599+DoubleYellowIce@users.noreply.github.com> Date: Sun, 12 Sep 2021 20:38:10 +0800 Subject: [PATCH 051/222] =?UTF-8?q?Update=200513.=E6=89=BE=E6=A0=91?= =?UTF-8?q?=E5=B7=A6=E4=B8=8B=E8=A7=92=E7=9A=84=E5=80=BC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前的链接失效,无法点击 --- problems/0513.找树左下角的值.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0513.找树左下角的值.md b/problems/0513.找树左下角的值.md index 0dcbbb76..d2c05fd8 100644 --- a/problems/0513.找树左下角的值.md +++ b/problems/0513.找树左下角的值.md @@ -9,7 +9,7 @@ # 513.找树左下角的值 -[力扣题目链接]([https://leetcode-cn.com/problems/find-bottom-left-tree-value/](https://leetcode-cn.com/problems/find-bottom-left-tree-value/v)) +[力扣题目链接](https://leetcode-cn.com/problems/find-bottom-left-tree-value/) 给定一个二叉树,在树的最后一行找到最左边的值。 From ad3aecc7f3d8f5033bcacce86d68a2a420893f1c Mon Sep 17 00:00:00 2001 From: xsduan98 Date: Sun, 12 Sep 2021 20:53:53 +0800 Subject: [PATCH 052/222] =?UTF-8?q?463.=E5=B2=9B=E5=B1=BF=E7=9A=84?= =?UTF-8?q?=E5=91=A8=E9=95=BF=20=E6=B7=BB=E5=8A=A0Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0463.岛屿的周长.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/problems/0463.岛屿的周长.md b/problems/0463.岛屿的周长.md index 18654758..609c25a5 100644 --- a/problems/0463.岛屿的周长.md +++ b/problems/0463.岛屿的周长.md @@ -84,6 +84,37 @@ public: Java: +```java +// 解法一 +class Solution { + // 上下左右 4 个方向 + int[] dirx = {-1, 1, 0, 0}; + int[] diry = {0, 0, -1, 1}; + + public int islandPerimeter(int[][] grid) { + int m = grid.length; + int n = grid[0].length; + int res = 0; // 岛屿周长 + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (grid[i][j] == 1) { + for (int k = 0; k < 4; k++) { + int x = i + dirx[k]; + int y = j + diry[k]; + // 当前位置是陆地,并且从当前位置4个方向扩展的“新位置”是“水域”或“新位置“越界,则会为周长贡献一条边 + if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) { + res++; + continue; + } + } + } + } + } + return res; + } +} +``` + Python: Go: From b37bf8d2e25edd67e96a0f797ce03fc80cb6e133 Mon Sep 17 00:00:00 2001 From: hhj233 Date: Mon, 13 Sep 2021 10:44:59 +0800 Subject: [PATCH 053/222] feat: distance_dp-java --- ...编辑距离,卡尔做了三步铺垫.md | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md b/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md index 31a5e448..2eb253ba 100644 --- a/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md +++ b/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md @@ -167,7 +167,33 @@ else { Java: - +```java +class Solution { + public int minDistance(String word1, String word2) { + int m = word1.length(); + int n = word2.length(); + int[][] dp = new int[m+1][n+1]; + for(int i = 1; i <= m; i++){ + dp[i][0] = i; + } + for(int i = 1; i <= n; i++){ + dp[0][i] = i; + } + for(int i = 1; i <= m; i++){ + for(int j = 1; j <= n; j++){ + int left = dp[i][j-1]+1; + int mid = dp[i-1][j-1]; + int right = dp[i-1][j]+1; + if(word1.charAt(i-1) != word2.charAt(j-1)){ + mid ++; + } + dp[i][j] = Math.min(left,Math.min(mid,right)); + } + } + return dp[m][n]; + } +} +``` Python: From 00b7b3687f28f3e3b542375e11bdaa99803c75f0 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 13 Sep 2021 10:58:20 +0800 Subject: [PATCH 054/222] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/背包理论基础01背包-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index 2bcded70..7d04b514 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -34,7 +34,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, ## 01 背包 -有N件物品和一个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 +有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 ![动态规划-背包问题](https://img-blog.csdnimg.cn/20210117175428387.jpg) From 09293fe395442e5b46fdd24dbf7e58679dbbad4b Mon Sep 17 00:00:00 2001 From: Wen Date: Mon, 13 Sep 2021 19:57:54 +0800 Subject: [PATCH 055/222] =?UTF-8?q?=E4=BC=98=E5=8C=96=200257.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF=E5=BE=84?= =?UTF-8?q?.md=20Python3=E8=A7=A3=E6=B3=95=201.=20=E4=BC=98=E5=8C=96Python?= =?UTF-8?q?3=E9=80=92=E5=BD=92=E8=A7=A3=E6=B3=95=202.=20=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?Python3=E8=BF=AD=E4=BB=A3=E8=A7=A3=E6=B3=95=203.=20=E5=B0=BD?= =?UTF-8?q?=E9=87=8F=E9=81=B5=E5=AE=88PEP8=EF=BC=8C=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0257.二叉树的所有路径.md | 62 +++++++++++++++++------ 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index 2984427f..bfcbe4b5 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -371,25 +371,57 @@ class Solution { Python: ```Python class Solution: + """二叉树的所有路径 递归法""" + def binaryTreePaths(self, root: TreeNode) -> List[str]: - path=[] - res=[] - def backtrace(root, path): - if not root:return - path.append(root.val) - if (not root.left)and (not root.right): - res.append(path[:]) - ways=[] - if root.left:ways.append(root.left) - if root.right:ways.append(root.right) - for way in ways: - backtrace(way,path) - path.pop() - backtrace(root,path) - return ["->".join(list(map(str,i))) for i in res] + path, result = '', [] + self.traversal(root, path, result) + return result + + def traversal(self, cur: TreeNode, path: List, result: List): + path += str(cur.val) + # 如果当前节点为叶子节点,添加路径到结果中 + if not (cur.left or cur.right): + result.append(path) + return + + if cur.left: + self.traversal(cur.left, path + '->', result) + + if cur.right: + self.traversal(cur.right, path + '->', result) ``` +```python +from collections import deque + + +class Solution: + """二叉树的所有路径 迭代法""" + + def binaryTreePaths(self, root: TreeNode) -> List[str]: + # 题目中节点数至少为1 + stack, path_st, result = deque([root]), deque(), [] + path_st.append(str(root.val)) + + while stack: + cur = stack.pop() + path = path_st.pop() + # 如果当前节点为叶子节点,添加路径到结果中 + if not (cur.left or cur.right): + result.append(path) + if cur.right: + stack.append(cur.right) + path_st.append(path + '->' + str(cur.right.val)) + if cur.left: + stack.append(cur.left) + path_st.append(path + '->' + str(cur.left.val)) + + return result +``` + + Go: ```go func binaryTreePaths(root *TreeNode) []string { From f46c111d9e0f966a618436e0d054d21951b22cb9 Mon Sep 17 00:00:00 2001 From: Wen Date: Tue, 14 Sep 2021 19:39:46 +0800 Subject: [PATCH 056/222] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200654.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=20Python3=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=201.=20=E4=BF=AE=E5=A4=8D=E8=AF=AD=E6=B3=95=E9=94=99?= =?UTF-8?q?=E8=AF=AF=202.=20=E4=BC=98=E5=8C=96=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0654.最大二叉树.md | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/problems/0654.最大二叉树.md b/problems/0654.最大二叉树.md index 1a6d39af..b644a0a3 100644 --- a/problems/0654.最大二叉树.md +++ b/problems/0654.最大二叉树.md @@ -258,16 +258,30 @@ class Solution { ## Python ```python -//递归法 class Solution: + """最大二叉树 递归法""" + def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: - if not nums: return None //终止条件 - root = TreeNode(max(nums)) //新建节点 - p = nums.index(root.val) //找到最大值位置 - if p > 0: //保证有左子树 - root.left = self.constructMaximumBinaryTree(nums[:p]) //递归 - if p < len(nums): //保证有右子树 - root.right = self.constructMaximumBinaryTree(nums[p+1:]) //递归 + return self.traversal(nums, 0, len(nums)) + + def traversal(self, nums: List[int], begin: int, end: int) -> TreeNode: + # 列表长度为0时返回空节点 + if begin == end: + return None + + # 找到最大的值和其对应的下标 + max_index = begin + for i in range(begin, end): + if nums[i] > nums[max_index]: + max_index = i + + # 构建当前节点 + root = TreeNode(nums[max_index]) + + # 递归构建左右子树 + root.left = self.traversal(nums, begin, max_index) + root.right = self.traversal(nums, max_index + 1, end) + return root ``` From 35023c59947f11ed789c7ea32037dd793240f7a8 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Tue, 14 Sep 2021 20:09:16 +0800 Subject: [PATCH 057/222] =?UTF-8?q?Update=200494.=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0494.目标和.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 4993bede..07cf0433 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -321,7 +321,7 @@ const findTargetSumWays = (nums, target) => { const sum = nums.reduce((a, b) => a+b); - if(target > sum) { + if(Math.abs(target) > sum) { return 0; } From 28ffe90025db96c2db7cd7aa377736592567be7b Mon Sep 17 00:00:00 2001 From: ThinkingXuan <1454739828@qq.com> Date: Tue, 14 Sep 2021 20:42:04 +0800 Subject: [PATCH 058/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200496.=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0I.md=20Go?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0496.下一个更大元素I.md Go语言版本 --- problems/0496.下一个更大元素I.md | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/problems/0496.下一个更大元素I.md b/problems/0496.下一个更大元素I.md index 95aca60b..0c4fdd65 100644 --- a/problems/0496.下一个更大元素I.md +++ b/problems/0496.下一个更大元素I.md @@ -238,4 +238,37 @@ class Solution: return result ``` +Go: +```go +func nextGreaterElement(nums1 []int, nums2 []int) []int { + res := make([]int, len(nums1)) + for i:= range res { + res[i] = -1 + } + mp := map[int]int{} + for i,v := range nums1 { + mp[v] = i + } + // 单调栈 + stack := []int{} + stack = append(stack,0) + + for i:=1; i0 && nums2[i] > nums2[stack[len(stack)-1]] { + + top := stack[len(stack)-1] + + if _, ok := mp[nums2[top]]; ok { // 看map里是否存在这个元素 + index := mp[nums2[top]]; // 根据map找到nums2[top] 在 nums1中的下表 + res[index] = nums2[i] + } + + stack = stack[:len(stack)-1] // 出栈 + } + stack = append(stack, i) + } + return res +} +``` +
From 313f706648efe1b3fff335033022a7099f5a801a Mon Sep 17 00:00:00 2001 From: yqq Date: Wed, 15 Sep 2021 10:19:16 +0800 Subject: [PATCH 059/222] =?UTF-8?q?0684.=E5=86=97=E4=BD=99=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=EF=BC=8C=E5=A2=9E=E5=8A=A0Java,=20Golang,=20Python?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0684.冗余连接.md | 148 ++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/problems/0684.冗余连接.md b/problems/0684.冗余连接.md index c9eb33c4..bfbdeba9 100644 --- a/problems/0684.冗余连接.md +++ b/problems/0684.冗余连接.md @@ -10,6 +10,9 @@ # 684.冗余连接 + +[力扣题目链接](https://leetcode-cn.com/problems/redundant-connection/) + 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。 @@ -140,16 +143,161 @@ public: ## Java ```java +class Solution { + private int n; // 节点数量3 到 1000 + private int[] father; + public Solution() { + n = 1005; + father = new int[n]; + + // 并查集初始化 + for (int i = 0; i < n; ++i) { + father[i] = i; + } + } + + // 并查集里寻根的过程 + private int find(int u) { + if(u == father[u]) { + return u; + } + father[u] = find(father[u]); + return father[u]; + } + + // 将v->u 这条边加入并查集 + private void join(int u, int v) { + u = find(u); + v = find(v); + if (u == v) return ; + father[v] = u; + } + + // 判断 u 和 v是否找到同一个根,本题用不上 + private Boolean same(int u, int v) { + u = find(u); + v = find(v); + return u == v; + } + + public int[] findRedundantConnection(int[][] edges) { + for (int i = 0; i < edges.length; i++) { + if (same(edges[i][0], edges[i][1])) { + return edges[i]; + } else { + join(edges[i][0], edges[i][1]); + } + } + return null; + } +} ``` ## Python ```python + +class Solution: + + def __init__(self): + """ + 初始化 + """ + self.n = 1005 + self.father = [i for i in range(self.n)] + + + def find(self, u): + """ + 并查集里寻根的过程 + """ + if u == self.father[u]: + return u + self.father[u] = self.find(self.father[u]) + return self.father[u] + + def join(self, u, v): + """ + 将v->u 这条边加入并查集 + """ + u = self.find(u) + v = self.find(v) + if u == v : return + self.father[v] = u + pass + + + def same(self, u, v ): + """ + 判断 u 和 v是否找到同一个根,本题用不上 + """ + u = self.find(u) + v = self.find(v) + return u == v + + def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: + for i in range(len(edges)): + if self.same(edges[i][0], edges[i][1]) : + return edges[i] + else : + self.join(edges[i][0], edges[i][1]) + return [] ``` ## Go ```go + +// 全局变量 +var ( + n = 1005 // 节点数量3 到 1000 + father = make([]int, 1005) +) + +// 并查集初始化 +func initialize() { + for i := 0; i < n; i++ { + father[i] = i + } +} + +// 并查集里寻根的过程 +func find(u int) int { + if u == father[u] { + return u + } + father[u] = find(father[u]) + return father[u] +} + +// 将v->u 这条边加入并查集 +func join(u, v int) { + u = find(u) + v = find(v) + if u == v { + return + } + father[v] = u +} + +// 判断 u 和 v是否找到同一个根,本题用不上 +func same(u, v int) bool { + u = find(u) + v = find(v) + return u == v +} + +func findRedundantConnection(edges [][]int) []int { + initialize() + for i := 0; i < len(edges); i++ { + if same(edges[i][0], edges[i][1]) { + return edges[i] + } else { + join(edges[i][0], edges[i][1]) + } + } + return []int{} +} ``` ## JavaScript From 6cdf24179e932d3d2dbc38a2a06f2891a4e7481a Mon Sep 17 00:00:00 2001 From: X-shuffle <53906918+X-shuffle@users.noreply.github.com> Date: Wed, 15 Sep 2021 10:20:15 +0800 Subject: [PATCH 060/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200474.=E4=B8=80?= =?UTF-8?q?=E5=92=8C=E9=9B=B6=20=20=EF=BC=88=E4=B8=89=E7=BB=B4=E6=95=B0?= =?UTF-8?q?=E7=BB=84=EF=BC=8C=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=EF=BC=8C?= =?UTF-8?q?=E5=A5=BD=E7=90=86=E8=A7=A3=EF=BC=89Go=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0474.一和零 (三维数组,动态规划,好理解)Go语言版本 --- problems/0474.一和零.md | 47 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/problems/0474.一和零.md b/problems/0474.一和零.md index e3b05704..5544c3c9 100644 --- a/problems/0474.一和零.md +++ b/problems/0474.一和零.md @@ -248,6 +248,53 @@ func max(a,b int) int { return b } ``` +> 传统背包,三维数组法 +```golang +func findMaxForm(strs []string, m int, n int) int { + //dp的第一个index代表项目的多少,第二个代表的是背包的容量 + //所以本处项目的多少是len(strs),容量为m和n + dp:=make([][][]int,len(strs)+1) + for i:=0;i<=len(strs);i++{ + //初始化背包容量 + strDp:=make([][]int,m+1) + for j:=0;j=zero&&j>=one{ + dp[k][i][j]=getMax(dp[k-1][i][j],dp[k-1][i-zero][j-one]+1) + } + } + } + } + return dp[len(strs)][m][n] +} +func getMax(a,b int)int{ + if a>b{ + return a + } + return b +} +``` Javascript: ```javascript From cf4cc04fda9ebfcd143bbfff329ba2d33302b257 Mon Sep 17 00:00:00 2001 From: X-shuffle <53906918+X-shuffle@users.noreply.github.com> Date: Wed, 15 Sep 2021 11:20:50 +0800 Subject: [PATCH 061/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200494.=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E5=92=8C=EF=BC=88=E6=9B=B4=E6=96=B0=E7=89=88=EF=BC=8C?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E4=B8=AA=E8=B7=91=E4=B8=8D=E9=80=9A=E4=BA=86?= =?UTF-8?q?=EF=BC=8C=E5=9B=A0=E4=B8=BA=E4=BC=9A=E5=AD=98=E5=9C=A8len?= =?UTF-8?q?=E5=B0=8F=E4=BA=8E0=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=89Go?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 0494.目标和(更新版,上一个跑不通了,因为会存在len小于0的情况)Go语言版本 --- problems/0494.目标和.md | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 4993bede..95b49d43 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -314,6 +314,47 @@ func findTargetSumWays(nums []int, target int) int { return dp[bag] } ``` +> 更新版,上一个跑不通了,因为会存在len小于0的情况 + +```go +func findTargetSumWays(nums []int, target int) int { + //先转化为数学问题 + //a-b=target + //a+b=sum + //a=(target+sum)/2 + //求出sum + var sum int + for _,value:=range nums{ + sum+=value + } + //如果sum Date: Wed, 15 Sep 2021 11:21:26 +0800 Subject: [PATCH 062/222] =?UTF-8?q?Update=200494.=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0494.目标和.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 95b49d43..20f9dea1 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -314,7 +314,7 @@ func findTargetSumWays(nums []int, target int) int { return dp[bag] } ``` -> 更新版,上一个跑不通了,因为会存在len小于0的情况 +> 更新版,上一个跑不通了,因为会存在bag 小于0的情况 ```go func findTargetSumWays(nums []int, target int) int { From e3b1f9d9164ec97470486c03ebae0e12cc31b95f Mon Sep 17 00:00:00 2001 From: yqq Date: Wed, 15 Sep 2021 14:44:28 +0800 Subject: [PATCH 063/222] =?UTF-8?q?0685.=E5=86=97=E4=BD=99=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5II.md,=20=E5=A2=9E=E5=8A=A0Java,=20Golang,=20Python?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0685.冗余连接II.md | 307 +++++++++++++++++++++++++++++++- 1 file changed, 302 insertions(+), 5 deletions(-) diff --git a/problems/0685.冗余连接II.md b/problems/0685.冗余连接II.md index 68d0376e..404813f3 100644 --- a/problems/0685.冗余连接II.md +++ b/problems/0685.冗余连接II.md @@ -39,7 +39,7 @@ **这说明题目中的图原本是是一棵树,只不过在不增加节点的情况下多加了一条边!** -还有**若有多个答案,返回最后出现在给定二维数组的答案。**这说明在两天边都可以删除的情况下,要删顺序靠后的! +还有**若有多个答案,返回最后出现在给定二维数组的答案。**这说明在两条边都可以删除的情况下,要删顺序靠后的! 那么有如下三种情况,前两种情况是出现入度为2的点,如图: @@ -58,7 +58,7 @@ 首先先计算节点的入度,代码如下: -```CPP +```cpp int inDegree[N] = {0}; // 记录节点入度 n = edges.size(); // 边的数量 for (int i = 0; i < n; i++) { @@ -70,7 +70,7 @@ for (int i = 0; i < n; i++) { 代码如下: -```CPP +```cpp vector vec; // 记录入度为2的边(如果有的话就两条边) // 找入度为2的节点所对应的边,注意要倒叙,因为优先返回最后出现在二维数组中的答案 for (int i = n - 1; i >= 0; i--) { @@ -112,7 +112,7 @@ vector getRemoveEdge(const vector>& edges) 本题C++代码如下:(详细注释了) -```CPP +```cpp class Solution { private: static const int N = 1010; // 如题:二维数组大小的在3到1000范围内 @@ -174,7 +174,7 @@ public: inDegree[edges[i][1]]++; // 统计入度 } vector vec; // 记录入度为2的边(如果有的话就两条边) - // 找入度为2的节点所对应的边,注意要倒叙,因为优先返回最后出现在二维数组中的答案 + // 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案 for (int i = n - 1; i >= 0; i--) { if (inDegree[edges[i][1]] == 2) { vec.push_back(i); @@ -203,16 +203,313 @@ public: ## Java ```java + +class Solution { + + private static final int N = 1010; // 如题:二维数组大小的在3到1000范围内 + private int[] father; + public Solution() { + father = new int[N]; + + // 并查集初始化 + for (int i = 0; i < N; ++i) { + father[i] = i; + } + } + + // 并查集里寻根的过程 + private int find(int u) { + if(u == father[u]) { + return u; + } + father[u] = find(father[u]); + return father[u]; + } + + // 将v->u 这条边加入并查集 + private void join(int u, int v) { + u = find(u); + v = find(v); + if (u == v) return ; + father[v] = u; + } + + // 判断 u 和 v是否找到同一个根,本题用不上 + private Boolean same(int u, int v) { + u = find(u); + v = find(v); + return u == v; + } + + /** + * 初始化并查集 + */ + private void initFather() { + // 并查集初始化 + for (int i = 0; i < N; ++i) { + father[i] = i; + } + } + + /** + * 在有向图里找到删除的那条边,使其变成树 + * @param edges + * @return 要删除的边 + */ + private int[] getRemoveEdge(int[][] edges) { + initFather(); + for(int i = 0; i < edges.length; i++) { + if(same(edges[i][0], edges[i][1])) { // 构成有向环了,就是要删除的边 + return edges[i]; + } + join(edges[i][0], edges[i][1]); + } + return null; + } + + /** + * 删一条边之后判断是不是树 + * @param edges + * @param deleteEdge 要删除的边 + * @return true: 是树, false: 不是树 + */ + private Boolean isTreeAfterRemoveEdge(int[][] edges, int deleteEdge) + { + initFather(); + for(int i = 0; i < edges.length; i++) + { + if(i == deleteEdge) continue; + if(same(edges[i][0], edges[i][1])) { // 构成有向环了,一定不是树 + return false; + } + join(edges[i][0], edges[i][1]); + } + return true; + } + + public int[] findRedundantDirectedConnection(int[][] edges) { + int[] inDegree = new int[N]; + for(int i = 0; i < edges.length; i++) + { + // 入度 + inDegree[ edges[i][1] ] += 1; + } + + // 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案 + ArrayList twoDegree = new ArrayList(); + for(int i = edges.length - 1; i >= 0; i--) + { + if(inDegree[edges[i][1]] == 2) { + twoDegree.add(i); + } + } + + // 处理图中情况1 和 情况2 + // 如果有入度为2的节点,那么一定是两条边里删一个,看删哪个可以构成树 + if(!twoDegree.isEmpty()) + { + if(isTreeAfterRemoveEdge(edges, twoDegree.get(0))) { + return edges[ twoDegree.get(0)]; + } + return edges[ twoDegree.get(1)]; + } + + // 明确没有入度为2的情况,那么一定有有向环,找到构成环的边返回就可以了 + return getRemoveEdge(edges); + } +} ``` ## Python ```python + +class Solution: + + def __init__(self): + self.n = 1010 + self.father = [i for i in range(self.n)] + + + def find(self, u: int): + """ + 并查集里寻根的过程 + """ + if u == self.father[u]: + return u + self.father[u] = self.find(self.father[u]) + return self.father[u] + + def join(self, u: int, v: int): + """ + 将v->u 这条边加入并查集 + """ + u = self.find(u) + v = self.find(v) + if u == v : return + self.father[v] = u + pass + + + def same(self, u: int, v: int ): + """ + 判断 u 和 v是否找到同一个根,本题用不上 + """ + u = self.find(u) + v = self.find(v) + return u == v + + def init_father(self): + self.father = [i for i in range(self.n)] + pass + + def getRemoveEdge(self, edges: List[List[int]]) -> List[int]: + """ + 在有向图里找到删除的那条边,使其变成树 + """ + + self.init_father() + for i in range(len(edges)): + if self.same(edges[i][0], edges[i][1]): # 构成有向环了,就是要删除的边 + return edges[i] + self.join(edges[i][0], edges[i][1]); + return [] + + def isTreeAfterRemoveEdge(self, edges: List[List[int]], deleteEdge: int) -> bool: + """ + 删一条边之后判断是不是树 + """ + + self.init_father() + for i in range(len(edges)): + if i == deleteEdge: continue + if self.same(edges[i][0], edges[i][1]): # 构成有向环了,一定不是树 + return False + self.join(edges[i][0], edges[i][1]); + return True + + def findRedundantDirectedConnection(self, edges: List[List[int]]) -> List[int]: + inDegree = [0 for i in range(self.n)] + + for i in range(len(edges)): + inDegree[ edges[i][1] ] += 1 + + # 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案 + towDegree = [] + for i in range(len(edges))[::-1]: + if inDegree[edges[i][1]] == 2 : + towDegree.append(i) + + # 处理图中情况1 和 情况2 + # 如果有入度为2的节点,那么一定是两条边里删一个,看删哪个可以构成树 + if len(towDegree) > 0: + if(self.isTreeAfterRemoveEdge(edges, towDegree[0])) : + return edges[towDegree[0]] + return edges[towDegree[1]] + + # 明确没有入度为2的情况,那么一定有有向环,找到构成环的边返回就可以了 + return self.getRemoveEdge(edges) ``` ## Go ```go + +// 全局变量 +var ( + n = 1010// 节点数量3 到 1000 + father = make([]int, n) +) + +// 并查集初始化 +func initialize() { + for i := 0; i < n; i++ { + father[i] = i + } +} + +// 并查集里寻根的过程 +func find(u int) int { + if u == father[u] { + return u + } + father[u] = find(father[u]) + return father[u] +} + +// 将v->u 这条边加入并查集 +func join(u, v int) { + u = find(u) + v = find(v) + if u == v { + return + } + father[v] = u +} + +// 判断 u 和 v是否找到同一个根,本题用不上 +func same(u, v int) bool { + u = find(u) + v = find(v) + return u == v +} + +// getRemoveEdge 在有向图里找到删除的那条边,使其变成树 +func getRemoveEdge(edges [][]int) []int { + initialize() + for i := 0; i < len(edges); i++ { // 遍历所有的边 + if same(edges[i][0], edges[i][1]) { // 构成有向环了,就是要删除的边 + return edges[i] + } + join(edges[i][0], edges[i][1]) + } + return []int{} +} + +// isTreeAfterRemoveEdge 删一条边之后判断是不是树 +func isTreeAfterRemoveEdge(edges [][]int, deleteEdge int) bool { + initialize() + for i := 0; i < len(edges); i++ { + if i == deleteEdge { + continue + } + if same(edges[i][0], edges[i][1]) { // 构成有向环了,一定不是树 + return false + } + join(edges[i][0], edges[i][1]) + } + return true +} + +func findRedundantDirectedConnection(edges [][]int) []int { + inDegree := make([]int, len(father)) + for i := 0; i < len(edges); i++ { + // 统计入度 + inDegree[edges[i][1]] += 1 + } + // 记录入度为2的边(如果有的话就两条边) + // 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案 + twoDegree := make([]int, 0) + for i := len(edges) - 1; i >= 0; i-- { + if inDegree[edges[i][1]] == 2 { + twoDegree = append(twoDegree, i) + } + } + + // 处理图中情况1 和 情况2 + // 如果有入度为2的节点,那么一定是两条边里删一个,看删哪个可以构成树 + if len(twoDegree) > 0 { + if isTreeAfterRemoveEdge(edges, twoDegree[0]) { + return edges[twoDegree[0]] + } + return edges[twoDegree[1]] + } + + // 处理图中情况3 + // 明确没有入度为2的情况,那么一定有有向环,找到构成环的边返回就可以了 + return getRemoveEdge(edges) +} + ``` ## JavaScript From 8f479eea994307e6948e5664a67d3ebe7868efd3 Mon Sep 17 00:00:00 2001 From: konng Date: Thu, 16 Sep 2021 10:18:35 +0800 Subject: [PATCH 064/222] =?UTF-8?q?=E7=BA=A0=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这里不需要声明 vector vec --- problems/0102.二叉树的层序遍历.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index a2fd6f03..376af7a2 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1173,7 +1173,7 @@ public: if (root != NULL) que.push(root); while (!que.empty()) { int size = que.size(); - vector vec; + // vector vec; Node* nodePre; Node* node; for (int i = 0; i < size; i++) { From 4672df4638ef85a12556360e9d1b2c257035dda2 Mon Sep 17 00:00:00 2001 From: kok-s0s <2694308562@qq.com> Date: Thu, 16 Sep 2021 12:31:58 +0800 Subject: [PATCH 065/222] =?UTF-8?q?=E6=8F=90=E4=BE=9BJavaScript=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E3=80=8A=E6=9C=80=E5=90=8E=E4=B8=80=E5=9D=97?= =?UTF-8?q?=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D=E9=87=8FII=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1049.最后一块石头的重量II.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/1049.最后一块石头的重量II.md b/problems/1049.最后一块石头的重量II.md index c09e476a..59c59189 100644 --- a/problems/1049.最后一块石头的重量II.md +++ b/problems/1049.最后一块石头的重量II.md @@ -219,7 +219,28 @@ func max(a, b int) int { } ``` +JavaScript版本 +```javascript +/** + * @param {number[]} stones + * @return {number} + */ +var lastStoneWeightII = function (stones) { + let sum = stones.reduce((s, n) => s + n); + + let dpLen = Math.floor(sum / 2); + let dp = new Array(dpLen + 1).fill(0); + + for (let i = 0; i < stones.length; ++i) { + for (let j = dpLen; j >= stones[i]; --j) { + dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]); + } + } + + return sum - dp[dpLen] - dp[dpLen]; +}; +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 3ac368fc5a860b0afa49f378da75f3c4b1db90e6 Mon Sep 17 00:00:00 2001 From: yqq Date: Thu, 16 Sep 2021 16:29:03 +0800 Subject: [PATCH 066/222] =?UTF-8?q?/0724.=E5=AF=BB=E6=89=BE=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=9A=84=E4=B8=AD=E5=BF=83=E7=B4=A2=E5=BC=95.md,=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Goalng=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0724.寻找数组的中心索引.md | 26 +++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/problems/0724.寻找数组的中心索引.md b/problems/0724.寻找数组的中心索引.md index b4115893..991ce647 100644 --- a/problems/0724.寻找数组的中心索引.md +++ b/problems/0724.寻找数组的中心索引.md @@ -9,6 +9,8 @@ # 724.寻找数组的中心下标 +[力扣题目链接](https://leetcode-cn.com/problems/find-pivot-index/) + 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 @@ -87,15 +89,15 @@ class Solution { } ``` -## Python +## Python3 -```python3 +```python class Solution: def pivotIndex(self, nums: List[int]) -> int: numSum = sum(nums) #数组总和 leftSum = 0 for i in range(len(nums)): - if numSum - leftSum -nums[i] == leftSum: #左右和相等 + if numSum - leftSum -nums[i] == leftSum: #左右和相等 return i leftSum += nums[i] return -1 @@ -104,6 +106,24 @@ class Solution: ## Go ```go +func pivotIndex(nums []int) int { + sum := 0 + for _, v := range nums { + sum += v; + } + + leftSum := 0 // 中心索引左半和 + rightSum := 0 // 中心索引右半和 + for i := 0; i < len(nums); i++ { + leftSum += nums[i] + rightSum = sum - leftSum + nums[i] + if leftSum == rightSum{ + return i + } + } + return -1 +} + ``` ## JavaScript From 1d4187b8c7eec98c4491b8b6ab88ed9b9f2fe037 Mon Sep 17 00:00:00 2001 From: baici1 <249337001@qq.com> Date: Thu, 16 Sep 2021 19:46:14 +0800 Subject: [PATCH 067/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A037.=E8=A7=A3=E6=95=B0?= =?UTF-8?q?=E7=8B=AC=EF=BC=8Cgo=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0037.解数独.md | 55 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/problems/0037.解数独.md b/problems/0037.解数独.md index b6fa0d6e..48e1f2f2 100644 --- a/problems/0037.解数独.md +++ b/problems/0037.解数独.md @@ -376,6 +376,61 @@ class Solution: Go: +```go +func solveSudoku(board [][]byte) { + var backtracking func(board [][]byte) bool + backtracking=func(board [][]byte) bool{ + for i:=0;i<9;i++{ + for j:=0;j<9;j++{ + //判断此位置是否适合填数字 + if board[i][j]!='.'{ + continue + } + //尝试填1-9 + for k:='1';k<='9';k++{ + if isvalid(i,j,byte(k),board)==true{//如果满足要求就填 + board[i][j]=byte(k) + if backtracking(board)==true{ + return true + } + board[i][j]='.' + } + } + return false + } + } + return true + } + backtracking(board) +} +//判断填入数字是否满足要求 +func isvalid(row,col int,k byte,board [][]byte)bool{ + for i:=0;i<9;i++{//行 + if board[row][i]==k{ + return false + } + } + for i:=0;i<9;i++{//列 + if board[i][col]==k{ + return false + } + } + //方格 + startrow:=(row/3)*3 + startcol:=(col/3)*3 + for i:=startrow;i Date: Thu, 16 Sep 2021 23:08:42 +0800 Subject: [PATCH 068/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=860042.?= =?UTF-8?q?=E6=8E=A5=E9=9B=A8=E6=B0=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 介绍了一种比当前方法更优的双指针方法,提供了简要思路和带注释的代码 --- problems/0042.接雨水.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 4383a0b8..83b3f82c 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -134,6 +134,43 @@ public: 因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为O(n^2)。 空间复杂度为O(1)。 + + +一种更简便的双指针方法: + +之前的双指针方法的原理是固定“底”的位置,往两边找比它高的“壁”,循环若干次求和。 + +我们逆向思维,把“壁”用两个初始位置在数组首末位置的指针表示,“壁”往中间推,同样可以让每个“底”都能找到最高的“壁” + +本质上就是改变了运算方向,从而减少了重复运算 + +代码如下: + +```C +int trap(int* height, int heightSize) { + int ans = 0; + int left = 0, right = heightSize - 1; //初始化两个指针到左右两边 + int leftMax = 0, rightMax = 0; //这两个值用来记录左右的“壁”的最高值 + while (left < right) { //两个指针重合就结束 + leftMax = fmax(leftMax, height[left]); + rightMax = fmax(rightMax, height[right]); + if (leftMax < rightMax) { + ans += leftMax - height[left]; //这里考虑的是下标为left的“底”能装多少水 + ++left;//指针的移动次序是这个方法的关键 + //这里左指针右移是因为左“墙”较矮,左边这一片实际情况下的盛水量是受制于这个矮的左“墙”的 + //而较高的右边在实际情况下的限制条件可能不是当前的左“墙”,比如限制条件可能是右“墙”,就能装更高的水, + } + else { + ans += rightMax - height[right]; //同理,考虑下标为right的元素 + --right; + } + } + return ans; +} +``` +时间复杂度 O(n) +空间复杂度 O(1) + ## 动态规划解法 在上一节的双指针解法中,我们可以看到只要记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。 From 65531e6de8da4ed86347dc6b6980e9df0808d909 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 17 Sep 2021 10:11:52 +0800 Subject: [PATCH 069/222] =?UTF-8?q?0122=20=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA=E2=85=B1=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20js=20=E7=89=88=E6=9C=AC=20=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E6=95=B0=E7=BB=84=20=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...股票的最佳时机II(动态规划).md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/problems/0122.买卖股票的最佳时机II(动态规划).md b/problems/0122.买卖股票的最佳时机II(动态规划).md index 5dfe3f0e..c324d392 100644 --- a/problems/0122.买卖股票的最佳时机II(动态规划).md +++ b/problems/0122.买卖股票的最佳时机II(动态规划).md @@ -202,6 +202,7 @@ Go: Javascript: ```javascript +// 方法一:动态规划(dp 数组) const maxProfit = (prices) => { let dp = Array.from(Array(prices.length), () => Array(2).fill(0)); // dp[i][0] 表示第i天持有股票所得现金。 @@ -222,6 +223,21 @@ const maxProfit = (prices) => { return dp[prices.length -1][0]; }; + +// 方法二:动态规划(滚动数组) +const maxProfit = (prices) => { + // 滚动数组 + // have: 第i天持有股票最大收益; notHave: 第i天不持有股票最大收益 + let n = prices.length, + have = -prices[0], + notHave = 0; + for (let i = 1; i < n; i++) { + have = Math.max(have, notHave - prices[i]); + notHave = Math.max(notHave, have + prices[i]); + } + // 最终手里不持有股票才能保证收益最大化 + return notHave; +} ``` From b91141ada6df34e1f1e4b6fb0e09ea31b1d64a3b Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 17 Sep 2021 11:07:10 +0800 Subject: [PATCH 070/222] =?UTF-8?q?0188=20=E4=B9=B0=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BAIV=20=20JavaScript?= =?UTF-8?q?=20=20=E6=B7=BB=E5=8A=A0=20=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?+=E7=A9=BA=E9=97=B4=E4=BC=98=E5=8C=96=20=20=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0188.买卖股票的最佳时机IV.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0188.买卖股票的最佳时机IV.md b/problems/0188.买卖股票的最佳时机IV.md index bcb8a1ab..a166db72 100644 --- a/problems/0188.买卖股票的最佳时机IV.md +++ b/problems/0188.买卖股票的最佳时机IV.md @@ -280,6 +280,7 @@ Go: Javascript: ```javascript +// 方法一:动态规划 const maxProfit = (k,prices) => { if (prices == null || prices.length < 2 || k == 0) { return 0; @@ -300,6 +301,30 @@ const maxProfit = (k,prices) => { return dp[prices.length - 1][2 * k]; }; + +// 方法二:动态规划+空间优化 +var maxProfit = function(k, prices) { + let n = prices.length; + let dp = new Array(2*k+1).fill(0); + // dp 买入状态初始化 + for (let i = 1; i <= 2*k; i += 2) { + dp[i] = - prices[0]; + } + + for (let i = 1; i < n; i++) { + for (let j = 1; j < 2*k+1; j++) { + // j 为奇数:买入状态 + if (j % 2) { + dp[j] = Math.max(dp[j], dp[j-1] - prices[i]); + } else { + // j为偶数:卖出状态 + dp[j] = Math.max(dp[j], dp[j-1] + prices[i]); + } + } + } + + return dp[2*k]; +}; ``` ----------------------- From 7b584ed5962c119dc9b0c85fbe83cd021978ada6 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 17 Sep 2021 13:39:36 +0800 Subject: [PATCH 071/222] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200027=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0=20javascript=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0027.移除元素.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index 78f9afb7..4afd347a 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -185,7 +185,7 @@ func removeElement(nums []int, val int) int { ``` JavaScript: -``` +```javascript //时间复杂度O(n) //空间复杂度O(1) var removeElement = (nums, val) => { From c911b6b65de08531115e19c465ae8ea519fe44af Mon Sep 17 00:00:00 2001 From: SambacFeng <56753082+SambacFeng@users.noreply.github.com> Date: Fri, 17 Sep 2021 16:40:17 +0800 Subject: [PATCH 072/222] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/数组理论基础.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/数组理论基础.md b/problems/数组理论基础.md index 6d7b9f9a..146cd2de 100644 --- a/problems/数组理论基础.md +++ b/problems/数组理论基础.md @@ -88,7 +88,7 @@ int main() { **所以可以看出在C++中二维数组在地址空间上是连续的**。 -像Java是没有指针的,同时也不对程序员暴漏其元素的地址,寻址操作完全交给虚拟机。 +像Java是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机。 所以看不到每个元素的地址情况,这里我以Java为例,也做一个实验。 From 2bd9b0280b9618236d37b74c3b7dd71884ba15b7 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 17 Sep 2021 20:01:44 +0800 Subject: [PATCH 073/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200718=20=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E9=87=8D=E5=A4=8D=E6=95=B0=E7=BB=84=20JavaScript=20?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E6=95=B0=E7=BB=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0718.最长重复子数组.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/problems/0718.最长重复子数组.md b/problems/0718.最长重复子数组.md index 9e3da663..712b5eeb 100644 --- a/problems/0718.最长重复子数组.md +++ b/problems/0718.最长重复子数组.md @@ -278,7 +278,26 @@ const findLength = (A, B) => { return res; }; ``` - +> 滚动数组 +```javascript +const findLength = (nums1, nums2) => { + let len1 = nums1.length, len2 = nums2.length; + // dp[i][j]: 以nums1[i-1]、nums2[j-1]为结尾的最长公共子数组的长度 + let dp = new Array(len2+1).fill(0); + let res = 0; + for (let i = 1; i <= len1; i++) { + for (let j = len2; j > 0; j--) { + if (nums1[i-1] === nums2[j-1]) { + dp[j] = dp[j-1] + 1; + } else { + dp[j] = 0; + } + res = Math.max(res, dp[j]); + } + } + return res; +} +``` ----------------------- From c41ce18dbbac14336d49f006c3d864f0b3a232f9 Mon Sep 17 00:00:00 2001 From: Wen Date: Fri, 17 Sep 2021 20:21:56 +0800 Subject: [PATCH 074/222] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200236.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E7=A5=96=E5=85=88.md=20Python3=E8=A7=A3=E6=B3=95=20=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DPython=E8=AF=AD=E6=B3=95=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0236.二叉树的最近公共祖先.md | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/problems/0236.二叉树的最近公共祖先.md b/problems/0236.二叉树的最近公共祖先.md index 59345a24..46dcb545 100644 --- a/problems/0236.二叉树的最近公共祖先.md +++ b/problems/0236.二叉树的最近公共祖先.md @@ -264,16 +264,21 @@ class Solution { ## Python ```python -//递归 class Solution: + """二叉树的最近公共祖先 递归法""" + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': - if not root or root == p or root == q: return root //找到了节点p或者q,或者遇到空节点 - left = self.lowestCommonAncestor(root.left,p,q) //左 - right = self.lowestCommonAncestor(root.right,p,q) //右 - if left and right: return root //中: left和right不为空,root就是最近公共节点 - elif left and not right: return left //目标节点是通过left返回的 - elif not left and right: return right //目标节点是通过right返回的 - else: return None //没找到 + if not root or root == p or root == q: + return root + + left = self.lowestCommonAncestor(root.left, p, q) + right = self.lowestCommonAncestor(root.right, p, q) + + if left and right: + return root + if left: + return left + return right ``` ## Go From ac8ca62309bb2dddb9990b8fdb90f23bf3959129 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 17 Sep 2021 21:43:52 +0800 Subject: [PATCH 075/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200739=20=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E6=B8=A9=E5=BA=A6=20=20JavaScript=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=20=E5=8D=95=E8=B0=83=E6=A0=88=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0739.每日温度.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md index b00701ed..53ce1133 100644 --- a/problems/0739.每日温度.md +++ b/problems/0739.每日温度.md @@ -276,6 +276,36 @@ func dailyTemperatures(num []int) []int { } ``` +JavaScript: +```javascript +/** + * @param {number[]} temperatures + * @return {number[]} + */ +var dailyTemperatures = function(temperatures) { + let n = temperatures.length; + let res = new Array(n).fill(0); + let stack = []; // 递减栈:用于存储元素右面第一个比他大的元素下标 + stack.push(0); + for (let i = 1; i < n; i++) { + // 栈顶元素 + let top = stack[stack.length - 1]; + if (temperatures[i] < temperatures[top]) { + stack.push(i); + } else if (temperatures[i] === temperatures[top]) { + stack.push(i); + } else { + while (stack.length && temperatures[i] > temperatures[stack[stack.length - 1]]) { + let top = stack.pop(); + res[top] = i - top; + } + stack.push(i); + } + } + return res; +}; +``` + ----------------------- From 3e069c66165d41e2eab3f3127de516dc4ef5cbc2 Mon Sep 17 00:00:00 2001 From: SambacFeng <56753082+SambacFeng@users.noreply.github.com> Date: Fri, 17 Sep 2021 23:55:11 +0800 Subject: [PATCH 076/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200202.=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0202.快乐数.md | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/problems/0202.快乐数.md b/problems/0202.快乐数.md index 710c824d..02db507a 100644 --- a/problems/0202.快乐数.md +++ b/problems/0202.快乐数.md @@ -159,26 +159,28 @@ func getSum(n int) int { javaScript: ```js -function getN(n) { - if (n == 1 || n == 0) return n; - let res = 0; - while (n) { - res += (n % 10) * (n % 10); - n = parseInt(n / 10); +var isHappy = function (n) { + let m = new Map() + + const getSum = (num) => { + let sum = 0 + while (n) { + sum += (n % 10) ** 2 + n = Math.floor(n / 10) + } + return sum + } + + while (true) { + // n出现过,证明已陷入无限循环 + if (m.has(n)) return false + if (n === 1) return true + m.set(n, 1) + n = getSum(n) } - return res; } -var isHappy = function(n) { - const sumSet = new Set(); - while (n != 1 && !sumSet.has(n)) { - sumSet.add(n); - n = getN(n); - } - return n == 1; -}; - -// 使用环形链表的思想 说明出现闭环 退出循环 +// 方法二:使用环形链表的思想 说明出现闭环 退出循环 var isHappy = function(n) { if (getN(n) == 1) return true; let a = getN(n), b = getN(getN(n)); From 8a4b3b1636af1272e561db534f9a4ccbcec7e45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E7=BB=B5=E7=A8=8B?= Date: Fri, 17 Sep 2021 16:12:24 -0700 Subject: [PATCH 077/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00077.=E7=BB=84?= =?UTF-8?q?=E5=90=88python2=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0077.组合.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/problems/0077.组合.md b/problems/0077.组合.md index 9b44b572..c72adb83 100644 --- a/problems/0077.组合.md +++ b/problems/0077.组合.md @@ -368,6 +368,34 @@ class Solution { } ``` +Python2: +```python +class Solution(object): + def combine(self, n, k): + """ + :type n: int + :type k: int + :rtype: List[List[int]] + """ + result = [] + path = [] + def backtracking(n, k, startidx): + if len(path) == k: + result.append(path[:]) + return + + # 剪枝, 最后k - len(path)个节点直接构造结果,无需递归 + last_startidx = n - (k - len(path)) + 1 + result.append(path + [idx for idx in range(last_startidx, n + 1)]) + + for x in range(startidx, last_startidx): + path.append(x) + backtracking(n, k, x + 1) # 递归 + path.pop() # 回溯 + + backtracking(n, k, 1) + return result +``` Python: ```python3 From 483b806975f92b564d2fa351f31c4e2ada8d93b2 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sat, 18 Sep 2021 09:03:39 +0800 Subject: [PATCH 078/222] Update --- README.md | 3 +- problems/0017.电话号码的字母组合.md | 23 +- problems/0037.解数独.md | 64 +++++ problems/0047.全排列II.md | 8 +- problems/0051.N皇后.md | 2 +- problems/0053.最大子序和.md | 2 + problems/0077.组合.md | 136 ++++++++-- problems/0078.子集.md | 4 +- problems/0090.子集II.md | 2 +- problems/0093.复原IP地址.md | 14 +- problems/0102.二叉树的层序遍历.md | 2 +- .../0122.买卖股票的最佳时机II.md | 52 +++- problems/0216.组合总和III.md | 18 +- ...09.最佳买卖股票时机含冷冻期.md | 1 - .../0450.删除二叉搜索树中的节点.md | 1 - problems/0491.递增子序列.md | 4 +- problems/0941.有效的山脉数组.md | 2 +- problems/1035.不相交的线.md | 2 +- .../前序/ACM模式如何构建二叉树.md | 243 ++++++++++++++++++ ...算法的时间与空间复杂度分析.md | 2 +- .../合适自己的就是最好的.md | 32 +++ 21 files changed, 550 insertions(+), 67 deletions(-) create mode 100644 problems/前序/ACM模式如何构建二叉树.md create mode 100644 problems/知识星球精选/合适自己的就是最好的.md diff --git a/README.md b/README.md index 96f7bb9c..282a2369 100644 --- a/README.md +++ b/README.md @@ -302,7 +302,8 @@ 题目分类大纲如下: -贪心算法大纲 + +贪心算法大纲 1. [关于贪心算法,你该了解这些!](./problems/贪心算法理论基础.md) 2. [贪心算法:分发饼干](./problems/0455.分发饼干.md) diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md index dfd0e875..9854ccdc 100644 --- a/problems/0017.电话号码的字母组合.md +++ b/problems/0017.电话号码的字母组合.md @@ -29,7 +29,7 @@ 如果输入"233"呢,那么就三层for循环,如果"2333"呢,就四层for循环....... -大家应该感觉出和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)遇到的一样的问题,就是这for循环的层数如何写出来,此时又是回溯法登场的时候了。 +大家应该感觉出和[77.组合](https://programmercarl.com/0077.组合.html)遇到的一样的问题,就是这for循环的层数如何写出来,此时又是回溯法登场的时候了。 理解本题后,要解决如下三个问题: @@ -75,7 +75,7 @@ const string letterMap[10] = { 再来看参数,参数指定是有题目中给的string digits,然后还要有一个参数就是int型的index。 -注意这个index可不是 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中的startIndex了。 +注意这个index可不是 [77.组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)中的startIndex了。 这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。 @@ -110,7 +110,7 @@ if (index == digits.size()) { 然后for循环来处理这个字符集,代码如下: -``` +```CPP int digit = digits[index] - '0'; // 将index指向的数字转为int string letters = letterMap[digit]; // 取数字对应的字符集 for (int i = 0; i < letters.size(); i++) { @@ -137,7 +137,7 @@ for (int i = 0; i < letters.size(); i++) { 关键地方都讲完了,按照[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中的回溯法模板,不难写出如下C++代码: -```c++ +```CPP // 版本一 class Solution { private: @@ -183,7 +183,7 @@ public: 一些写法,是把回溯的过程放在递归函数里了,例如如下代码,我可以写成这样:(注意注释中不一样的地方) -```c++ +```CPP // 版本二 class Solution { private: @@ -236,10 +236,10 @@ public: -## 其他语言版本 +# 其他语言版本 -Java: +## Java ```Java class Solution { @@ -281,7 +281,7 @@ class Solution { } ``` -Python: +## Python ```Python class Solution: @@ -340,10 +340,9 @@ class Solution: ``` -Go: +## Go - -> 主要在于递归中传递下一个数字 +主要在于递归中传递下一个数字 ```go func letterCombinations(digits string) []string { @@ -382,7 +381,7 @@ func recursion(tempString ,digits string, Index int,digitsMap [10]string, res *[ } ``` -javaScript: +## javaScript ```js var letterCombinations = function(digits) { diff --git a/problems/0037.解数独.md b/problems/0037.解数独.md index b6fa0d6e..c946e838 100644 --- a/problems/0037.解数独.md +++ b/problems/0037.解数独.md @@ -432,6 +432,70 @@ var solveSudoku = function(board) { }; ``` +C: + +```C +bool isValid(char** board, int row, int col, int k) { + /* 判断当前行是否有重复元素 */ + for (int i = 0; i < 9; i++) { + if (board[i][col] == k) { + return false; + } + } + /* 判断当前列是否有重复元素 */ + for (int j = 0; j < 9; j++) { + if (board[row][j] == k) { + return false; + } + } + /* 计算当前9宫格左上角的位置 */ + int startRow = (row / 3) * 3; + int startCol = (col / 3) * 3; + /* 判断当前元素所在九宫格是否有重复元素 */ + for (int i = startRow; i < startRow + 3; i++) { + for (int j = startCol; j < startCol + 3; j++) { + if (board[i][j] == k) { + return false; + } + } + } + /* 满足条件,返回true */ + return true; +} + +bool backtracking(char** board, int boardSize, int* boardColSize) { + /* 从上到下、从左到右依次遍历输入数组 */ + for (int i = 0; i < boardSize; i++) { + for (int j = 0; j < *boardColSize; j++) { + /* 遇到数字跳过 */ + if (board[i][j] != '.') { + continue; + } + /* 依次将数组1到9填入当前位置 */ + for (int k = '1'; k <= '9'; k++) { + /* 判断当前位置是否与满足条件,是则进入下一层 */ + if (isValid(board, i, j, k)) { + board[i][j] = k; + /* 判断下一层递归之后是否找到一种解法,是则返回true */ + if (backtracking(board, boardSize, boardColSize)) { + return true; + } + /* 回溯,将当前位置清零 */ + board[i][j] = '.'; + } + } + /* 若填入的9个数均不满足条件,返回false,说明此解法无效 */ + return false; + } + } + /* 遍历完所有的棋盘,没有返回false,说明找到了解法,返回true */ + return true; +} + +void solveSudoku(char** board, int boardSize, int* boardColSize) { + bool res = backtracking(board, boardSize, boardColSize); +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) diff --git a/problems/0047.全排列II.md b/problems/0047.全排列II.md index 01706eb3..c5de73c7 100644 --- a/problems/0047.全排列II.md +++ b/problems/0047.全排列II.md @@ -33,11 +33,11 @@ **如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 -这道题目和[回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html)的区别在与**给定一个可包含重复数字的序列**,要返回**所有不重复的全排列**。 +这道题目和[46.全排列](https://programmercarl.com/0046.全排列.html)的区别在与**给定一个可包含重复数字的序列**,要返回**所有不重复的全排列**。 这里又涉及到去重了。 -在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html) 、[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)我们分别详细讲解了组合问题和子集问题如何去重。 +在[40.组合总和II](https://programmercarl.com/0040.组合总和II.html) 、[90.子集II](https://programmercarl.com/0090.子集II.html)我们分别详细讲解了组合问题和子集问题如何去重。 那么排列问题其实也是一样的套路。 @@ -51,11 +51,11 @@ **一般来说:组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果**。 -在[回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html)中已经详解讲解了排列问题的写法,在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html) 、[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中详细讲解的去重的写法,所以这次我就不用回溯三部曲分析了,直接给出代码,如下: +在[46.全排列](https://programmercarl.com/0046.全排列.html)中已经详解讲解了排列问题的写法,在[40.组合总和II](https://programmercarl.com/0040.组合总和II.html) 、[90.子集II](https://programmercarl.com/0090.子集II.html)中详细讲解的去重的写法,所以这次我就不用回溯三部曲分析了,直接给出代码,如下: ## C++代码 -``` +```CPP class Solution { private: vector> result; diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md index 69802ecb..c141c326 100644 --- a/problems/0051.N皇后.md +++ b/problems/0051.N皇后.md @@ -147,7 +147,7 @@ for (int col = 0; col < n; col++) { 代码如下: -``` +```CPP bool isValid(int row, int col, vector& chessboard, int n) { int count = 0; // 检查列 diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index 53159978..18d3007e 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -103,6 +103,8 @@ public: 当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。 +不少同学认为 如果输入用例都是-1,或者 都是负数,这个贪心算法跑出来的结果是0, 这是**又一次证明脑洞模拟不靠谱的经典案例**,建议大家把代码运行一下试一试,就知道了,也会理解 为什么 result 要初始化为最小负数了。 + ## 动态规划 当然本题还可以用动态规划来做,当前[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)主要讲解贪心系列,后续到动态规划系列的时候会详细讲解本题的dp方法。 diff --git a/problems/0077.组合.md b/problems/0077.组合.md index 9b44b572..8ce1497b 100644 --- a/problems/0077.组合.md +++ b/problems/0077.组合.md @@ -29,7 +29,7 @@ 也可以直接看我的B站视频:[带你学透回溯算法-组合问题(对应力扣题目:77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv#reply3733925949) -## 思路 +# 思路 本题这是回溯法的经典题目。 @@ -37,7 +37,7 @@ 直接的解法当然是使用for循环,例如示例中k为2,很容易想到 用两个for循环,这样就可以输出 和示例中一样的结果。 代码如下: -``` +```CPP int n = 4; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { @@ -49,7 +49,7 @@ for (int i = 1; i <= n; i++) { 输入:n = 100, k = 3 那么就三层for循环,代码如下: -``` +```CPP int n = 100; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { @@ -301,7 +301,7 @@ for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i为本次搜 优化后整体代码如下: -``` +```CPP class Solution { private: vector> result; @@ -336,10 +336,10 @@ public: -## 其他语言版本 +# 其他语言版本 -Java: +## Java: ```java class Solution { List> result = new ArrayList<>(); @@ -369,7 +369,25 @@ class Solution { ``` -Python: +## Python +```python +class Solution: + def combine(self, n: int, k: int) -> List[List[int]]: + res = [] + path = [] + def backtrack(n, k, StartIndex): + if len(path) == k: + res.append(path[:]) + return + for i in range(StartIndex, n-(k-len(path)) + 2): + path.append(i) + backtrack(n, k, i+1) + path.pop() + backtrack(n, k, 1) + return res +``` + +剪枝: ```python3 class Solution: def combine(self, n: int, k: int) -> List[List[int]]: @@ -378,15 +396,19 @@ class Solution: def backtrack(n,k,startIndex): if len(path) == k: res.append(path[:]) - return - for i in range(startIndex,n+1): + return + for i in range(startIndex,n-(k-len(path))+2): #优化的地方 path.append(i) #处理节点 backtrack(n,k,i+1) #递归 path.pop() #回溯,撤销处理的节点 - backtrack(n,k,1) - return res + backtrack(n,k,1) + return res ``` -javascript + + +## javascript + +剪枝: ```javascript let result = [] let path = [] @@ -406,8 +428,11 @@ const combineHelper = (n, k, startIndex) => { path.pop() } } -``` -Go: +``` + + + +## Go ```Go var res [][]int func combine(n int, k int) [][]int { @@ -434,8 +459,35 @@ func backtrack(n,k,start int,track []int){ } } ``` +剪枝: +```Go +var res [][]int +func combine(n int, k int) [][]int { + res=[][]int{} + if n <= 0 || k <= 0 || k > n { + return res + } + backtrack(n, k, 1, []int{}) + return res +} +func backtrack(n,k,start int,track []int){ + if len(track)==k{ + temp:=make([]int,k) + copy(temp,track) + res=append(res,temp) + } + if len(track)+n-start+1 < k { + return + } + for i:=start;i<=n;i++{ + track=append(track,i) + backtrack(n,k,i+1,track) + track=track[:len(track)-1] + } +} +``` -C: +## C ```c int* path; int pathTop; @@ -489,6 +541,60 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ } ``` +剪枝: +```c +int* path; +int pathTop; +int** ans; +int ansTop; + +void backtracking(int n, int k,int startIndex) { + //当path中元素个数为k个时,我们需要将path数组放入ans二维数组中 + if(pathTop == k) { + //path数组为我们动态申请,若直接将其地址放入二维数组,path数组中的值会随着我们回溯而逐渐变化 + //因此创建新的数组存储path中的值 + int* temp = (int*)malloc(sizeof(int) * k); + int i; + for(i = 0; i < k; i++) { + temp[i] = path[i]; + } + ans[ansTop++] = temp; + return ; + } + + int j; + for(j = startIndex; j <= n- (k - pathTop) + 1;j++) { + //将当前结点放入path数组 + path[pathTop++] = j; + //进行递归 + backtracking(n, k, j + 1); + //进行回溯,将数组最上层结点弹出 + pathTop--; + } +} + +int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ + //path数组存储符合条件的结果 + path = (int*)malloc(sizeof(int) * k); + //ans二维数组存储符合条件的结果数组的集合。(数组足够大,避免极端情况) + ans = (int**)malloc(sizeof(int*) * 10000); + pathTop = ansTop = 0; + + //回溯算法 + backtracking(n, k, 1); + //最后的返回大小为ans数组大小 + *returnSize = ansTop; + //returnColumnSizes数组存储ans二维数组对应下标中一维数组的长度(都为k) + *returnColumnSizes = (int*)malloc(sizeof(int) *(*returnSize)); + int i; + for(i = 0; i < *returnSize; i++) { + (*returnColumnSizes)[i] = k; + } + //返回ans二维数组 + return ans; +} +``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) diff --git a/problems/0078.子集.md b/problems/0078.子集.md index 583fe664..fb4a8740 100644 --- a/problems/0078.子集.md +++ b/problems/0078.子集.md @@ -31,7 +31,7 @@ ## 思路 -求子集问题和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:分割问题!](https://programmercarl.com/0131.分割回文串.html)又不一样了。 +求子集问题和[77.组合](https://programmercarl.com/0077.组合.html)和[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)又不一样了。 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,**那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!** @@ -157,7 +157,7 @@ public: 相信大家经过了 * 组合问题: - * [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html) + * [回溯算法:求组合问题](https://programmercarl.com/0077.组合.html) * [回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html) * [回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html) * [回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html) diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index 6dc631de..c8cb42d3 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -32,7 +32,7 @@ 做本题之前一定要先做[78.子集](https://programmercarl.com/0078.子集.html)。 -这道题目和[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)区别就是集合里有重复元素了,而且求取的子集要去重。 +这道题目和[78.子集](https://programmercarl.com/0078.子集.html)区别就是集合里有重复元素了,而且求取的子集要去重。 那么关于回溯算法中的去重问题,**在[40.组合总和II](https://programmercarl.com/0040.组合总和II.html)中已经详细讲解过了,和本题是一个套路**。 diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 9f2ea6e7..6d01319a 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -45,11 +45,11 @@ s 仅由数字组成 ## 思路 -做这道题目之前,最好先把[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)这个做了。 +做这道题目之前,最好先把[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)这个做了。 这道题目相信大家刚看的时候,应该会一脸茫然。 -其实只要意识到这是切割问题,**切割问题就可以使用回溯搜索法把所有可能性搜出来**,和刚做过的[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)就十分类似了。 +其实只要意识到这是切割问题,**切割问题就可以使用回溯搜索法把所有可能性搜出来**,和刚做过的[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)就十分类似了。 切割问题可以抽象为树型结构,如图: @@ -60,7 +60,7 @@ s 仅由数字组成 * 递归参数 -在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中我们就提到切割问题类似组合问题。 +在[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)中我们就提到切割问题类似组合问题。 startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。 @@ -76,7 +76,7 @@ startIndex一定是需要的,因为不能重复分割,记录下一层递归 * 递归终止条件 -终止条件和[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。 +终止条件和[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。 pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。 @@ -96,7 +96,7 @@ if (pointNum == 3) { // 逗点数量为3时,分隔结束 * 单层搜索的逻辑 -在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中已经讲过在循环遍历中如何截取子串。 +在[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)中已经讲过在循环遍历中如何截取子串。 在`for (int i = startIndex; i < s.size(); i++)`循环中 [startIndex, i]这个区间就是截取的子串,需要判断这个子串是否合法。 @@ -239,11 +239,11 @@ public: ## 总结 -在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中我列举的分割字符串的难点,本题都覆盖了。 +在[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)中我列举的分割字符串的难点,本题都覆盖了。 而且本题还需要操作字符串添加逗号作为分隔符,并验证区间的合法性。 -可以说是[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)的加强版。 +可以说是[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)的加强版。 在本文的树形结构图中,我已经把详细的分析思路都画了出来,相信大家看了之后一定会思路清晰不少! diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index ac43f0a5..4b0908fd 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -6,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 二叉树层序遍历登场! 学会二叉树的层序遍历,可以一口气打完以下十题: @@ -20,7 +21,6 @@ * 104.二叉树的最大深度 * 111.二叉树的最小深度 -在之前写过这篇文章 [二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html),可惜当时只打了5个,还不够,再给我一次机会,我打十个! ![我要打十个](https://tva1.sinaimg.cn/large/008eGmZEly1gnadnltbpjg309603w4qp.gif) diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index bd837eea..4bbe9e5e 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -131,9 +131,9 @@ public: 一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后稳稳的就是最大利润了。 -## 其他语言版本 +# 其他语言版本 -Java: +## Java ```java // 贪心思路 @@ -171,7 +171,7 @@ class Solution { // 动态规划 -Python: +## Python ```python class Solution: def maxProfit(self, prices: List[int]) -> int: @@ -181,7 +181,21 @@ class Solution: return result ``` -Go: +python动态规划 +```python +class Solution: + def maxProfit(self, prices: List[int]) -> int: + length = len(prices) + dp = [[0] * 2 for _ in range(length)] + dp[0][0] = -prices[0] + dp[0][1] = 0 + for i in range(1, length): + dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]) #注意这里是和121. 买卖股票的最佳时机唯一不同的地方 + dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]) + return dp[-1][1] +``` + +## Go ```golang //贪心算法 func maxProfit(prices []int) int { @@ -217,9 +231,9 @@ func maxProfit(prices []int) int { } ``` -Javascript: +## Javascript +贪心 ```Javascript -// 贪心 var maxProfit = function(prices) { let result = 0 for(let i = 1; i < prices.length; i++) { @@ -229,7 +243,31 @@ var maxProfit = function(prices) { }; ``` -C: +动态规划 +```javascript +const maxProfit = (prices) => { + let dp = Array.from(Array(prices.length), () => Array(2).fill(0)); + // dp[i][0] 表示第i天持有股票所得现金。 + // dp[i][1] 表示第i天不持有股票所得最多现金 + dp[0][0] = 0 - prices[0]; + dp[0][1] = 0; + for(let i = 1; i < prices.length; i++) { + // 如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来 + // 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0] + // 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i] + dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] - prices[i]); + + // 在来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来 + // 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1] + // 第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1][0] + dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]); + } + + return dp[prices.length -1][0]; +}; +``` + +## C ```c int maxProfit(int* prices, int pricesSize){ int result = 0; diff --git a/problems/0216.组合总和III.md b/problems/0216.组合总和III.md index 177c6b03..f75105f0 100644 --- a/problems/0216.组合总和III.md +++ b/problems/0216.组合总和III.md @@ -30,7 +30,7 @@ 输出: [[1,2,6], [1,3,5], [2,3,4]] -## 思路 +# 思路 本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。 @@ -180,7 +180,7 @@ if (sum > targetSum) { // 剪枝操作 最后C++代码如下: -```c++ +```CPP class Solution { private: vector> result; // 存放结果集 @@ -223,10 +223,10 @@ public: -## 其他语言版本 +# 其他语言版本 -Java: +## Java 模板方法 ```java @@ -299,7 +299,8 @@ class Solution { } ``` -Python: +## Python + ```py class Solution: def combinationSum3(self, k: int, n: int) -> List[List[int]]: @@ -320,10 +321,9 @@ class Solution: return res ``` -Go: +## Go: - -> 回溯+减枝 +回溯+减枝 ```go func combinationSum3(k int, n int) [][]int { @@ -353,7 +353,7 @@ func backTree(n,k,startIndex int,track *[]int,result *[][]int){ } ``` -javaScript: +## javaScript: ```js // 等差数列 diff --git a/problems/0309.最佳买卖股票时机含冷冻期.md b/problems/0309.最佳买卖股票时机含冷冻期.md index 59178c64..1bb38568 100644 --- a/problems/0309.最佳买卖股票时机含冷冻期.md +++ b/problems/0309.最佳买卖股票时机含冷冻期.md @@ -27,7 +27,6 @@ ## 思路 -> 之前我们在[动态规划:最佳买卖股票时机含冷冻期](https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)讲过一次这道题目,讲解的过程感觉不是很严谨,和录友们也聊过这个问题,本着对大家负责的态度,有问题的地方我都会及时纠正,所以重新发文讲解一下。 相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题加上了一个冷冻期 diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index b12d40aa..f5133b84 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -472,7 +472,6 @@ var deleteNode = function (root, key) { cur = cur.left; } cur.left = root.left; - let temp = root; root = root.right; delete root; return root; diff --git a/problems/0491.递增子序列.md b/problems/0491.递增子序列.md index ea113f4b..d3dc3472 100644 --- a/problems/0491.递增子序列.md +++ b/problems/0491.递增子序列.md @@ -33,11 +33,11 @@ 这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。 -这又是子集,又是去重,是不是不由自主的想起了刚刚讲过的[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)。 +这又是子集,又是去重,是不是不由自主的想起了刚刚讲过的[90.子集II](https://programmercarl.com/0090.子集II.html)。 就是因为太像了,更要注意差别所在,要不就掉坑里了! -在[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中我们是通过排序,再加一个标记数组来达到去重的目的。 +在[90.子集II](https://programmercarl.com/0090.子集II.html)中我们是通过排序,再加一个标记数组来达到去重的目的。 而本题求自增子序列,是不能对原数组经行排序的,排完序的数组都是自增子序列了。 diff --git a/problems/0941.有效的山脉数组.md b/problems/0941.有效的山脉数组.md index ef5739e3..607031da 100644 --- a/problems/0941.有效的山脉数组.md +++ b/problems/0941.有效的山脉数组.md @@ -50,7 +50,7 @@ C++代码如下: -```c++ +```CPP class Solution { public: bool validMountainArray(vector& A) { diff --git a/problems/1035.不相交的线.md b/problems/1035.不相交的线.md index b71a5199..a10fd381 100644 --- a/problems/1035.不相交的线.md +++ b/problems/1035.不相交的线.md @@ -28,8 +28,8 @@ 拿示例一A = [1,4,2], B = [1,2,4]为例,相交情况如图: -![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210527113415.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914145158.png) 其实也就是说A和B的最长公共子序列是[1,4],长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面) diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md new file mode 100644 index 00000000..682e18f5 --- /dev/null +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -0,0 +1,243 @@ + +

+ + + + +

+

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ + +# 力扣上如何自己构造二叉树输入用例? + +经常有录友问,二叉树的题目中输入用例在ACM模式下应该怎么构造呢? + +力扣上的题目,输入用例就给了一个数组,怎么就能构造成二叉树呢? + +这次就给大家好好讲一讲! + +就拿最近公众号上 二叉树的打卡题目来说: + +[538.把二叉搜索树转换为累加树](https://mp.weixin.qq.com/s/rlJUFGCnXsIMX0Lg-fRpIw) + +其输入用例,就是用一个数组来表述 二叉树,如下: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914222335.png) + +一直跟着公众号学算法的录友 应该知道,我在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/Dza-fqjTyGrsRw4PWNKdxA),已经讲过,**只有 中序与后序 和 中序和前序 可以确定一颗唯一的二叉树。 前序和后序是不能确定唯一的二叉树的**。 + +那么[538.把二叉搜索树转换为累加树](https://mp.weixin.qq.com/s/rlJUFGCnXsIMX0Lg-fRpIw)的示例中,为什么,一个序列(数组或者是字符串)就可以确定二叉树了呢? + +很明显,是后台直接明确了构造规则。 + +再看一下 这个 输入序列 和 对应的二叉树。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914222335.png) + +从二叉树 推导到 序列,大家可以发现这就是层序遍历。 + +但从序列 推导到 二叉树,很多同学就看不懂了,这得怎么转换呢。 + +我在 [关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/q_eKfL8vmSbSFcptZ3aeRA)已经详细讲过,二叉树可以有两种存储方式,一种是 链式存储,另一种是顺序存储。 + +链式存储,就是大家熟悉的二叉树,用指针指向左右孩子。 + +顺序存储,就是用一个数组来存二叉树,其方式如图所示: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914223147.png) + +那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。 + +那么这里又有同学疑惑了,这些我都懂了,但我还是不知道 应该 怎么构造。 + +来,咱上代码。 昨天晚上 速度敲了一遍实现代码。 + +具体过程看注释: + +```CPP +// 根据数组构造二叉树 +TreeNode* construct_binary_tree(const vector& vec) { + vector vecTree (vec.size(), NULL); + TreeNode* root = NULL; + // 把输入数值数组,先转化为二叉树节点数组 + for (int i = 0; i < vec.size(); i++) { + TreeNode* node = NULL; + if (vec[i] != -1) node = new TreeNode(vec[i]); // 用 -1 表示null + vecTree[i] = node; + if (i == 0) root = node; + } + // 遍历一遍,根据规则左右孩子赋值就可以了 + // 注意这里 结束规则是 i * 2 + 2 < vec.size(),避免空指针 + for (int i = 0; i * 2 + 2 < vec.size(); i++) { + if (vecTree[i] != NULL) { + // 线性存储转连式存储关键逻辑 + vecTree[i]->left = vecTree[i * 2 + 1]; + vecTree[i]->right = vecTree[i * 2 + 2]; + } + } + return root; +} +``` + +这个函数最后返回的 指针就是 根节点的指针, 这就是 传入二叉树的格式了,也就是 力扣上的用例输入格式,如图: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914224422.png) + +也有不少同学在做ACM模式的题目,就经常疑惑: + +* 让我传入数值,我会! +* 让我传入数组,我会! +* 让我传入链表,我也会! +* **让我传入二叉树,我懵了,啥? 传入二叉树?二叉树怎么传?** + +其实传入二叉树,就是传入二叉树的根节点的指针,和传入链表都是一个逻辑。 + +这种现象主要就是大家对ACM模式过于陌生,说实话,ACM模式才真正的考察代码能力(注意不是算法能力),而 力扣的核心代码模式 总有一种 不够彻底的感觉。 + +所以,如果大家对ACM模式不够了解,一定要多去练习! + +那么以上的代码,我们根据数组构造二叉树,接来下我们在 把 这个二叉树打印出来,看看是不是 我们输入的二叉树结构,这里就用到了层序遍历,我们在[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)中讲过。 + + +完整测试代码如下: + +```CPP +#include +#include +#include +using namespace std; + +struct TreeNode { + int val; + TreeNode *left; + TreeNode *right; + TreeNode(int x) : val(x), left(NULL), right(NULL) {} +}; + +// 根据数组构造二叉树 +TreeNode* construct_binary_tree(const vector& vec) { + vector vecTree (vec.size(), NULL); + TreeNode* root = NULL; + for (int i = 0; i < vec.size(); i++) { + TreeNode* node = NULL; + if (vec[i] != -1) node = new TreeNode(vec[i]); + vecTree[i] = node; + if (i == 0) root = node; + } + for (int i = 0; i * 2 + 2 < vec.size(); i++) { + if (vecTree[i] != NULL) { + vecTree[i]->left = vecTree[i * 2 + 1]; + vecTree[i]->right = vecTree[i * 2 + 2]; + } + } + return root; +} + +// 层序打印打印二叉树 +void print_binary_tree(TreeNode* root) { + queue que; + if (root != NULL) que.push(root); + vector> result; + while (!que.empty()) { + int size = que.size(); + vector vec; + for (int i = 0; i < size; i++) { + TreeNode* node = que.front(); + que.pop(); + if (node != NULL) { + vec.push_back(node->val); + que.push(node->left); + que.push(node->right); + } + // 这里的处理逻辑是为了把null节点打印出来,用-1 表示null + else vec.push_back(-1); + } + result.push_back(vec); + } + for (int i = 0; i < result.size(); i++) { + for (int j = 0; j < result[i].size(); j++) { + cout << result[i][j] << " "; + } + cout << endl; + } +} + +int main() { + // 注意本代码没有考虑输入异常数据的情况 + // 用 -1 来表示null + vector vec = {4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8}; + TreeNode* root = construct_binary_tree(vec); + print_binary_tree(root); +} + +``` + +可以看出我们传入的数组是:{4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8} , 这里是用 -1 来表示null, + +和 [538.把二叉搜索树转换为累加树](https://mp.weixin.qq.com/s/rlJUFGCnXsIMX0Lg-fRpIw) 中的输入是一样的 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914222335.png) + +这里可能又有同学疑惑,你这不一样啊,题目是null,你为啥用-1。 + +用-1 表示null为了方便举例,如果非要和 力扣输入一样一样的,就是简单的字符串处理,把null 替换为 -1 就行了。 + +在来看,测试代码输出的效果: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914230045.png) + +可以看出和 题目中输入用例 这个图 是一样一样的。 只不过题目中图没有把 空节点 画出来而已。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914230118.png) + +大家可以拿我的代码去测试一下,跑一跑。 + +**注意:我的测试代码,并没有处理输入异常的情况(例如输入空数组之类的),处理各种输入异常,大家可以自己去练练**。 + + +# 总结 + +大家可以发现,这个问题,其实涉及很多知识点,而这些知识点 其实我在文章里都讲过,而且是详细的讲过,如果大家能把这些知识点串起来,很容易解决心中的疑惑了。 + +但为什么很多录友都没有想到这个程度呢。 + +这也是我反复强调,**代码随想录上的 题目和理论基础,至少要详细刷两遍**。 + +**[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)**里有的录友已经开始三刷: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727234031.png) + +只做过一遍,真的就是懂了一点皮毛, 第二遍刷才有真的对各个题目有较为深入的理解,也会明白 我为什么要这样安排刷题的顺序了。 + +**都是卡哥的良苦用心呀!** + + +# 其他语言版本 + + +## Java + +```Java +``` + + +## Python + +```Python +``` + + +## Go + +```Go +``` + +## JavaScript + +```JavaScript +``` + +----------------------- +* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) +* B站视频:[代码随想录](https://space.bilibili.com/525438321) +* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +
diff --git a/problems/前序/递归算法的时间与空间复杂度分析.md b/problems/前序/递归算法的时间与空间复杂度分析.md index 7a690781..63376d11 100644 --- a/problems/前序/递归算法的时间与空间复杂度分析.md +++ b/problems/前序/递归算法的时间与空间复杂度分析.md @@ -247,7 +247,7 @@ int binary_search( int arr[], int l, int r, int x) { 每次递归的空间复杂度可以看出主要就是参数里传入的这个arr数组,但需要注意的是在C/C++中函数传递数组参数,不是整个数组拷贝一份传入函数而是传入的数组首元素地址。 -**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的时间复杂度是常数即:O(1)。 +**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的空间复杂度是常数即:O(1)。 再来看递归的深度,二分查找的递归深度是logn ,递归深度就是调用栈的长度,那么这段代码的空间复杂度为 1 * logn = O(logn)。 diff --git a/problems/知识星球精选/合适自己的就是最好的.md b/problems/知识星球精选/合适自己的就是最好的.md new file mode 100644 index 00000000..2f28483e --- /dev/null +++ b/problems/知识星球精选/合适自己的就是最好的.md @@ -0,0 +1,32 @@ +# 合适自己的,才是最好的! + +秋招已经进入下半场了,不少同学也拿到了offer,但不是说非要进大厂,每个人情况都不一样,**合适自己的,就是最好的!**。 + +知识星球里有一位录友,就终于拿到了合适自己的offer,并不是大厂,是南京的一家公司,**但很合适自己,其实就非常值得开心**。 + + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910232502.png) + + +其实我算是一路见证了这位录友披荆斩棘,**从一开始基础并不好,还是非科班,到 实验室各种不顺利,再到最后面试次次受打击,最后终于拿到自己满意的offer**。 + +这一路下来确实不容易! + +这位录友是从几年五月份加入星球。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910221030.png) + +然后就开始每天坚持打卡。 可以看看她每天的打卡内容。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910222325.png) + +后面因为天天面试,不能坚持打卡了,也是和大部分同学一样,焦虑并努力着。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910222854.png) + +星球里完整的记录了 这位录友 从五月份以来每天的学习内容和学习状态,能感觉出来 **虽然苦难重重,但依然元气满满!** + +我在发文的时候 看了一遍她这几个月完整的打卡过程,还是深有感触的。 + +星球里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 + From 66e69535a36497ada74284e69b6ff087b22a4eed Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sat, 18 Sep 2021 09:05:06 +0800 Subject: [PATCH 079/222] Update --- problems/0042.接雨水.md | 71 ++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 83b3f82c..16c788eb 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -136,40 +136,6 @@ public: -一种更简便的双指针方法: - -之前的双指针方法的原理是固定“底”的位置,往两边找比它高的“壁”,循环若干次求和。 - -我们逆向思维,把“壁”用两个初始位置在数组首末位置的指针表示,“壁”往中间推,同样可以让每个“底”都能找到最高的“壁” - -本质上就是改变了运算方向,从而减少了重复运算 - -代码如下: - -```C -int trap(int* height, int heightSize) { - int ans = 0; - int left = 0, right = heightSize - 1; //初始化两个指针到左右两边 - int leftMax = 0, rightMax = 0; //这两个值用来记录左右的“壁”的最高值 - while (left < right) { //两个指针重合就结束 - leftMax = fmax(leftMax, height[left]); - rightMax = fmax(rightMax, height[right]); - if (leftMax < rightMax) { - ans += leftMax - height[left]; //这里考虑的是下标为left的“底”能装多少水 - ++left;//指针的移动次序是这个方法的关键 - //这里左指针右移是因为左“墙”较矮,左边这一片实际情况下的盛水量是受制于这个矮的左“墙”的 - //而较高的右边在实际情况下的限制条件可能不是当前的左“墙”,比如限制条件可能是右“墙”,就能装更高的水, - } - else { - ans += rightMax - height[right]; //同理,考虑下标为right的元素 - --right; - } - } - return ans; -} -``` -时间复杂度 O(n) -空间复杂度 O(1) ## 动态规划解法 @@ -569,6 +535,43 @@ Go: JavaScript: +C: + +一种更简便的双指针方法: + +之前的双指针方法的原理是固定“底”的位置,往两边找比它高的“壁”,循环若干次求和。 + +我们逆向思维,把“壁”用两个初始位置在数组首末位置的指针表示,“壁”往中间推,同样可以让每个“底”都能找到最高的“壁” + +本质上就是改变了运算方向,从而减少了重复运算 + +代码如下: + +```C +int trap(int* height, int heightSize) { + int ans = 0; + int left = 0, right = heightSize - 1; //初始化两个指针到左右两边 + int leftMax = 0, rightMax = 0; //这两个值用来记录左右的“壁”的最高值 + while (left < right) { //两个指针重合就结束 + leftMax = fmax(leftMax, height[left]); + rightMax = fmax(rightMax, height[right]); + if (leftMax < rightMax) { + ans += leftMax - height[left]; //这里考虑的是下标为left的“底”能装多少水 + ++left;//指针的移动次序是这个方法的关键 + //这里左指针右移是因为左“墙”较矮,左边这一片实际情况下的盛水量是受制于这个矮的左“墙”的 + //而较高的右边在实际情况下的限制条件可能不是当前的左“墙”,比如限制条件可能是右“墙”,就能装更高的水, + } + else { + ans += rightMax - height[right]; //同理,考虑下标为right的元素 + --right; + } + } + return ans; +} +``` +时间复杂度 O(n) +空间复杂度 O(1) + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 99e26666ee48de0d129ff7e85ee3ba248ad7bd94 Mon Sep 17 00:00:00 2001 From: konng Date: Sat, 18 Sep 2021 13:30:25 +0800 Subject: [PATCH 080/222] =?UTF-8?q?=E7=BA=A0=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除多余的一个 “这” 字 --- problems/0101.对称二叉树.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/problems/0101.对称二叉树.md b/problems/0101.对称二叉树.md index 03d3acaa..3abf26cb 100644 --- a/problems/0101.对称二叉树.md +++ b/problems/0101.对称二叉树.md @@ -185,7 +185,8 @@ public: queue que; que.push(root->left); // 将左子树头结点加入队列 que.push(root->right); // 将右子树头结点加入队列 - while (!que.empty()) { // 接下来就要判断这这两个树是否相互翻转 + + while (!que.empty()) { // 接下来就要判断这两个树是否相互翻转 TreeNode* leftNode = que.front(); que.pop(); TreeNode* rightNode = que.front(); que.pop(); if (!leftNode && !rightNode) { // 左节点为空、右节点为空,此时说明是对称的 From 2b1f90a266733882a0b06eb1a846297a65f20c89 Mon Sep 17 00:00:00 2001 From: yqq Date: Sat, 18 Sep 2021 16:17:11 +0800 Subject: [PATCH 081/222] =?UTF-8?q?0841.=E9=92=A5=E5=8C=99=E5=92=8C?= =?UTF-8?q?=E6=88=BF=E9=97=B4.md,=20=E5=A2=9E=E5=8A=A0=20Golang,=20Java,?= =?UTF-8?q?=20Python=20=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0841.钥匙和房间.md | 99 ++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md index 4a0185ec..2ce9d343 100644 --- a/problems/0841.钥匙和房间.md +++ b/problems/0841.钥匙和房间.md @@ -121,10 +121,109 @@ public: Java: +```java +class Solution { + private void dfs(int key, List> rooms, List visited) { + if (visited.get(key)) { + return; + } + + visited.set(key, true); + for (int k : rooms.get(key)) { + // 深度优先搜索遍历 + dfs(k, rooms, visited); + } + } + + + public boolean canVisitAllRooms(List> rooms) { + List visited = new ArrayList(){{ + for(int i = 0 ; i < rooms.size(); i++){ + add(false); + } + }}; + + dfs(0, rooms, visited); + + //检查是否都访问到了 + for (boolean flag : visited) { + if (!flag) { + return false; + } + } + return true; + } +} +``` + + + + Python: +python3 + +```python + +class Solution: + + def dfs(self, key: int, rooms: List[List[int]] , visited : List[bool] ) : + if visited[key] : + return + + visited[key] = True + keys = rooms[key] + for i in range(len(keys)) : + # 深度优先搜索遍历 + self.dfs(keys[i], rooms, visited) + + def canVisitAllRooms(self, rooms: List[List[int]]) -> bool: + visited = [False for i in range(len(rooms))] + + self.dfs(0, rooms, visited) + + # 检查是否都访问到了 + for i in range(len(visited)): + if not visited[i] : + return False + return True + +``` + + Go: +```go + +func dfs(key int, rooms [][]int, visited []bool ) { + if visited[key] { + return; + } + + visited[key] = true + keys := rooms[key] + for _ , key := range keys { + // 深度优先搜索遍历 + dfs(key, rooms, visited); + } +} + +func canVisitAllRooms(rooms [][]int) bool { + + visited := make([]bool, len(rooms)); + + dfs(0, rooms, visited); + + //检查是否都访问到了 + for i := 0; i < len(visited); i++ { + if !visited[i] { + return false; + } + } + return true; +} +``` + JavaScript: ----------------------- From 9b37c68aaffd2d789ff2161520db3465016a495a Mon Sep 17 00:00:00 2001 From: yqq Date: Sat, 18 Sep 2021 16:55:21 +0800 Subject: [PATCH 082/222] =?UTF-8?q?0844.=E6=AF=94=E8=BE=83=E5=90=AB?= =?UTF-8?q?=E9=80=80=E6=A0=BC=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2.md,=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Python,=20Golang=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0841.钥匙和房间.md | 2 +- problems/0844.比较含退格的字符串.md | 41 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md index 2ce9d343..caa0edaf 100644 --- a/problems/0841.钥匙和房间.md +++ b/problems/0841.钥匙和房间.md @@ -212,7 +212,7 @@ func canVisitAllRooms(rooms [][]int) bool { visited := make([]bool, len(rooms)); - dfs(0, rooms, visited); + dfs(0, rooms, visited); //检查是否都访问到了 for i := 0; i < len(visited); i++ { diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md index e6bf3493..74455ace 100644 --- a/problems/0844.比较含退格的字符串.md +++ b/problems/0844.比较含退格的字符串.md @@ -188,8 +188,49 @@ class Solution { Python: +python3 + +```python +class Solution: + + def get_string(self, s: str) -> str : + bz = [] + for i in range(len(s)) : + c = s[i] + if c != '#' : + bz.append(c) # 模拟入栈 + elif len(bz) > 0: # 栈非空才能弹栈 + bz.pop() # 模拟弹栈 + return str(bz) + + def backspaceCompare(self, s: str, t: str) -> bool: + return self.get_string(s) == self.get_string(t) + pass +``` + + Go: +```go + +func getString(s string) string { + bz := []rune{} + for _, c := range s { + if c != '#' { + bz = append(bz, c); // 模拟入栈 + } else if len(bz) > 0 { // 栈非空才能弹栈 + bz = bz[:len(bz)-1] // 模拟弹栈 + } + } + return string(bz) +} + +func backspaceCompare(s string, t string) bool { + return getString(s) == getString(t) +} + +``` + JavaScript: ----------------------- From 43f30b23ab2928f277793bfede1df028b4dd4cfb Mon Sep 17 00:00:00 2001 From: Wen Date: Sat, 18 Sep 2021 22:17:47 +0800 Subject: [PATCH 083/222] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=200235.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E7=A5=96=E5=85=88.md=20Python3=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0235.二叉搜索树的最近公共祖先.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/problems/0235.二叉搜索树的最近公共祖先.md b/problems/0235.二叉搜索树的最近公共祖先.md index 929e6eb2..7fad5af0 100644 --- a/problems/0235.二叉搜索树的最近公共祖先.md +++ b/problems/0235.二叉搜索树的最近公共祖先.md @@ -260,13 +260,15 @@ class Solution { 递归法: ```python class Solution: + """二叉搜索树的最近公共祖先 递归法""" + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': - if not root: return root //中 - if root.val >p.val and root.val > q.val: - return self.lowestCommonAncestor(root.left,p,q) //左 - elif root.val < p.val and root.val < q.val: - return self.lowestCommonAncestor(root.right,p,q) //右 - else: return root + if root.val > p.val and root.val > q.val: + return self.lowestCommonAncestor(root.left, p, q) + if root.val < p.val and root.val < q.val: + return self.lowestCommonAncestor(root.right, p, q) + return root + ``` 迭代法: From 08199d56b5c99f3a23150b99a0cdfd4812fcdeb5 Mon Sep 17 00:00:00 2001 From: Wen Date: Sat, 18 Sep 2021 22:18:30 +0800 Subject: [PATCH 084/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200235.=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E7=A5=96=E5=85=88.md=20Python3=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0235.二叉搜索树的最近公共祖先.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/problems/0235.二叉搜索树的最近公共祖先.md b/problems/0235.二叉搜索树的最近公共祖先.md index 7fad5af0..c9ef95dd 100644 --- a/problems/0235.二叉搜索树的最近公共祖先.md +++ b/problems/0235.二叉搜索树的最近公共祖先.md @@ -268,11 +268,22 @@ class Solution: if root.val < p.val and root.val < q.val: return self.lowestCommonAncestor(root.right, p, q) return root - ``` 迭代法: +```python +class Solution: + """二叉搜索树的最近公共祖先 迭代法""" + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': + while True: + if root.val > p.val and root.val > q.val: + root = root.left + elif root.val < p.val and root.val < q.val: + root = root.right + else: + return root +``` ## Go From d88ba0549bc38f2e577d13a18d8bb606529426b1 Mon Sep 17 00:00:00 2001 From: yqq Date: Sun, 19 Sep 2021 10:59:16 +0800 Subject: [PATCH 085/222] =?UTF-8?q?0922.=E6=8C=89=E5=A5=87=E5=81=B6?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84II=20,=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?golang=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0922.按奇偶排序数组II.md | 28 ++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/problems/0922.按奇偶排序数组II.md b/problems/0922.按奇偶排序数组II.md index 97d7091e..5b66247e 100644 --- a/problems/0922.按奇偶排序数组II.md +++ b/problems/0922.按奇偶排序数组II.md @@ -11,6 +11,8 @@ # 922. 按奇偶排序数组II +[力扣题目链接](https://leetcode-cn.com/problems/sort-array-by-parity-ii/) + 给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。 @@ -147,9 +149,9 @@ class Solution { } ``` -## Python +## Python3 -```python3 +```python #方法2 class Solution: def sortArrayByParityII(self, nums: List[int]) -> List[int]: @@ -180,6 +182,28 @@ class Solution: ## Go ```go + +// 方法一 +func sortArrayByParityII(nums []int) []int { + // 分别存放 nums 中的奇数、偶数 + even, odd := []int{}, []int{} + for i := 0; i < len(nums); i++ { + if (nums[i] % 2 == 0) { + even = append(even, nums[i]) + } else { + odd = append(odd, nums[i]) + } + } + + // 把奇偶数组重新存回 nums + result := make([]int, len(nums)) + index := 0 + for i := 0; i < len(even); i++ { + result[index] = even[i]; index++; + result[index] = odd[i]; index++; + } + return result; +} ``` ## JavaScript From 34f4a7b7ba3c240db160d710df054c0f8b7732ab Mon Sep 17 00:00:00 2001 From: yqq Date: Sun, 19 Sep 2021 18:13:54 +0800 Subject: [PATCH 086/222] =?UTF-8?q?925.=E9=95=BF=E6=8C=89=E9=94=AE?= =?UTF-8?q?=E5=85=A5=20,=20=E5=A2=9E=E5=8A=A0Golang=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0925.长按键入.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/problems/0925.长按键入.md b/problems/0925.长按键入.md index 3502f2fb..70597508 100644 --- a/problems/0925.长按键入.md +++ b/problems/0925.长按键入.md @@ -134,7 +134,7 @@ Python: class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: i, j = 0, 0 - m, n = len(name) , len(typed) + m, n = len(name) , len(typed) while i< m and j < n: if name[i] == typed[j]: # 相同时向后匹配 i += 1 @@ -155,8 +155,32 @@ class Solution: else: return False return True ``` + Go: +```go + +func isLongPressedName(name string, typed string) bool { + if(name[0] != typed[0] || len(name) > len(typed)) { + return false; + } + + idx := 0 // name的索引 + var last byte // 上个匹配字符 + for i := 0; i < len(typed); i++ { + if idx < len(name) && name[idx] == typed[i] { + last = name[idx] + idx++ + } else if last == typed[i] { + continue + } else { + return false + } + } + return idx == len(name) +} +``` + JavaScript: ----------------------- From 3f99399aa48319b7942de32fd6b7e66cbeb527df Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 19 Sep 2021 18:34:00 +0800 Subject: [PATCH 087/222] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85-1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 冗余python临时变量 --- problems/背包理论基础01背包-1.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index 7d04b514..32ad30d3 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -315,7 +315,6 @@ Python: def test_2_wei_bag_problem1(bag_size, weight, value) -> int: rows, cols = len(weight), bag_size + 1 dp = [[0 for _ in range(cols)] for _ in range(rows)] - res = 0 # 初始化dp数组. for i in range(rows): @@ -334,8 +333,6 @@ def test_2_wei_bag_problem1(bag_size, weight, value) -> int: else: # 定义dp数组: dp[i][j] 前i个物品里,放进容量为j的背包,价值总和最大是多少。 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cur_weight]+ cur_val) - if dp[i][j] > res: - res = dp[i][j] print(dp) From 0bb07f39e8e1b2e37ce6866b061afb569025fc14 Mon Sep 17 00:00:00 2001 From: yqq Date: Mon, 20 Sep 2021 16:10:18 +0800 Subject: [PATCH 088/222] =?UTF-8?q?941.=E6=9C=89=E6=95=88=E7=9A=84?= =?UTF-8?q?=E5=B1=B1=E8=84=89=E6=95=B0=E7=BB=84,=20=E5=A2=9E=E5=8A=A0Pytho?= =?UTF-8?q?n,=20Golang=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0941.有效的山脉数组.md | 42 ++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/problems/0941.有效的山脉数组.md b/problems/0941.有效的山脉数组.md index 607031da..c4c8ebfa 100644 --- a/problems/0941.有效的山脉数组.md +++ b/problems/0941.有效的山脉数组.md @@ -7,7 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 941.有效的山脉数组 +# 941.有效的山脉数组 [力扣题目链接](https://leetcode-cn.com/problems/valid-mountain-array/) @@ -103,14 +103,52 @@ class Solution { } ``` -## Python +## Python3 ```python +class Solution: + def validMountainArray(self, arr: List[int]) -> bool: + if len(arr) < 3 : + return False + + i = 1 + flagIncrease = False # 上升 + flagDecrease = False # 下降 + + while i < len(arr) and arr[i-1] < arr[i]: + flagIncrease = True + i += 1 + + while i < len(arr) and arr[i-1] > arr[i]: + flagDecrease = True + i += 1 + + return i == len(arr) and flagIncrease and flagDecrease + ``` ## Go ```go +func validMountainArray(arr []int) bool { + if len(arr) < 3 { + return false + } + + i := 1 + flagIncrease := false // 上升 + flagDecrease := false // 下降 + + for ; i < len(arr) && arr[i-1] < arr[i]; i++ { + flagIncrease = true; + } + + for ; i < len(arr) && arr[i-1] > arr[i]; i++ { + flagDecrease = true; + } + + return i == len(arr) && flagIncrease && flagDecrease; +} ``` ## JavaScript From 270757a277ffd0c58c0a09805e694f7dfe6858ff Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Thu, 23 Sep 2021 08:54:00 +0800 Subject: [PATCH 089/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200053=20=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C=20JavaScript=20=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 既然已经知道dp数组长度,初始化时就应该创建一个固定长度的数组,而不是直接用 [nums[0]] 代替,这样会影响性能 --- problems/0053.最大子序和(动态规划).md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/problems/0053.最大子序和(动态规划).md b/problems/0053.最大子序和(动态规划).md index 1efd7e12..4c2a2944 100644 --- a/problems/0053.最大子序和(动态规划).md +++ b/problems/0053.最大子序和(动态规划).md @@ -173,7 +173,8 @@ JavaScript: ```javascript const maxSubArray = nums => { // 数组长度,dp初始化 - const [len, dp] = [nums.length, [nums[0]]]; + const len = nums.length; + let dp = new Array(len).fill(0); // 最大值初始化为dp[0] let max = dp[0]; for (let i = 1; i < len; i++) { From 3ed64ced80c3f5c874d95bfc466f20c7cd6933ef Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 23 Sep 2021 10:58:49 +0800 Subject: [PATCH 090/222] Update --- README.md | 4 + problems/0015.三数之和.md | 38 -------- problems/0018.四数之和.md | 5 +- problems/0039.组合总和.md | 36 +++---- problems/0040.组合总和II.md | 25 ++--- problems/0349.两个数组的交集.md | 2 +- problems/0454.四数相加II.md | 28 +----- problems/0496.下一个更大元素I.md | 23 +++++ .../0673.最长递增子序列的个数.md | 2 +- .../合适自己的就是最好的.md | 4 +- .../秋招下半场依然没offer.md | 95 +++++++++++++++++++ 11 files changed, 161 insertions(+), 101 deletions(-) create mode 100644 problems/知识星球精选/秋招下半场依然没offer.md diff --git a/README.md b/README.md index 282a2369..82c28969 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,8 @@ ## 知识星球精选 +* [秋招下半场依然没offer,怎么办?](./problems/知识星球精选/秋招下半场依然没offer.md) +* [合适自己的就是最好的](./problems/知识星球精选/合适自己的就是最好的.md) * [为什么都说客户端会消失](./problems/知识星球精选/客三消.md) * [博士转计算机如何找工作](./problems/知识星球精选/博士转行计算机.md) * [不一样的七夕](./problems/知识星球精选/不一样的七夕.md) @@ -462,6 +464,8 @@ * [24.两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md) * [234.回文链表](./problems/0234.回文链表.md) * [143.重排链表](./problems/0143.重排链表.md)【数组】【双向队列】【直接操作链表】 + + * [141.环形链表](./problems/0141.环形链表.md) ## 哈希表 diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index 6b5311ae..d3d7f61e 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -354,44 +354,6 @@ def is_valid(strs) end ``` -php: - -```php -function threeSum(array $nums): array -{ - $result = []; - $length = count($nums); - if ($length < 3) { - return []; - } - sort($nums); - for ($i = 0; $i < $length; $i++) { - // 如果大于0结束 - if ($nums[$i] > 0) break; - // 去重 - if ($i > 0 && $nums[$i] == $nums[$i - 1]) continue; - $left = $i + 1; - $right = $length - 1; - // 比较 - while ($left < $right) { - $sum = $nums[$i] + $nums[$left] + $nums[$right]; - if ($sum < 0) { - $left++; - } elseif ($sum > 0) { - $right--; - } else { - array_push($result, [$nums[$i], $nums[$left], $nums[$right]]); - while ($left < $right && $nums[$left] == $nums[$left + 1]) $left++; - while ($left < $right && $nums[$right - 1] == $nums[$right]) $right--; - $left++; - $right--; - } - } - } - - return $result; -} -``` PHP: ```php diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index 9891f0fe..e283b291 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -90,7 +90,8 @@ public: int left = i + 1; int right = nums.size() - 1; while (right > left) { - if (nums[k] + nums[i] + nums[left] + nums[right] > target) { + // nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出 + if (nums[k] + nums[i] > target - (nums[left] + nums[right])) { right--; } else if (nums[k] + nums[i] + nums[left] + nums[right] < target) { left++; @@ -110,8 +111,8 @@ public: } return result; } - }; + ``` diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index 97987e6d..4836de9c 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -7,7 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 39. 组合总和 +# 39. 组合总和 [力扣题目链接](https://leetcode-cn.com/problems/combination-sum/) @@ -37,21 +37,21 @@ candidates 中的数字可以无限制重复被选取。   [3,5] ] -## 思路 +# 思路 [B站视频讲解-组合总和](https://www.bilibili.com/video/BV1KT4y1M7HJ) 题目中的**无限制重复被选取,吓得我赶紧想想 出现0 可咋办**,然后看到下面提示:1 <= candidates[i] <= 200,我就放心了。 -本题和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。 +本题和[77.组合](https://programmercarl.com/0077.组合.html),[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。 本题搜索的过程抽象成树形结构如下: ![39.组合总和](https://img-blog.csdnimg.cn/20201223170730367.png) 注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回! -而在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。 +而在[77.组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。 ## 回溯三部曲 @@ -65,9 +65,9 @@ candidates 中的数字可以无限制重复被选取。 **本题还需要startIndex来控制for循环的起始位置,对于组合问题,什么时候需要startIndex呢?** -我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)。 +我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:[77.组合](https://programmercarl.com/0077.组合.html),[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)。 -如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html) +如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[17.电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html) **注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路,后面我再讲解排列的时候就重点介绍**。 @@ -103,7 +103,7 @@ if (sum == target) { 单层for循环依然是从startIndex开始,搜索candidates集合。 -**注意本题和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)、[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)的一个区别是:本题元素为可重复选取的**。 +**注意本题和[77.组合](https://programmercarl.com/0077.组合.html)、[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)的一个区别是:本题元素为可重复选取的**。 如何重复选取呢,看代码,注释部分: @@ -211,16 +211,16 @@ public: }; ``` -## 总结 +# 总结 -本题和我们之前讲过的[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)、[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)有两点不同: +本题和我们之前讲过的[77.组合](https://programmercarl.com/0077.组合.html)、[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)有两点不同: * 组合没有数量要求 * 元素可无限重复选取 针对这两个问题,我都做了详细的分析。 -并且给出了对于组合问题,什么时候用startIndex,什么时候不用,并用[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)做了对比。 +并且给出了对于组合问题,什么时候用startIndex,什么时候不用,并用[17.电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)做了对比。 最后还给出了本题的剪枝优化,这个优化如果是初学者的话并不容易想到。 @@ -232,10 +232,10 @@ public: -## 其他语言版本 +# 其他语言版本 -Java: +## Java ```Java // 剪枝优化 class Solution { @@ -264,7 +264,7 @@ class Solution { } ``` -Python: +## Python ```python3 class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: @@ -284,10 +284,9 @@ class Solution: backtrack(candidates,target,0,0) return res ``` -Go: - -> 主要在于递归中传递下一个数字 +## Go +主要在于递归中传递下一个数字 ```go func combinationSum(candidates []int, target int) [][]int { @@ -319,7 +318,8 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int) } ``` -JavaScript: + +## JavaScript: ```js var combinationSum = function(candidates, target) { @@ -346,7 +346,7 @@ var combinationSum = function(candidates, target) { }; ``` -C: +## C ```c int* path; int pathTop; diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index 8925ef81..d6f4dac9 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -9,7 +9,7 @@ > 这篇可以说是全网把组合问题如何去重,讲的最清晰的了! -## 40.组合总和II +# 40.组合总和II [力扣题目链接](https://leetcode-cn.com/problems/combination-sum-ii/) @@ -39,7 +39,7 @@ candidates 中的每个数字在每个组合中只能使用一次。   [5] ] -## 思路 +# 思路 **如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。 @@ -157,7 +157,6 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; **注意sum + candidates[i] <= target为剪枝操作,在[39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)有讲解过!** -## C++代码 回溯三部曲分析完了,整体C++代码如下: @@ -242,7 +241,7 @@ public: ``` -## 总结 +# 总结 本题同样是求组合总和,但就是因为其数组candidates有重复元素,而要求不能有重复的组合,所以相对于[39.组合总和](https://programmercarl.com/0039.组合总和.html)难度提升了不少。 @@ -254,10 +253,10 @@ public: -## 其他语言版本 +# 其他语言版本 -Java: +## Java ```Java class Solution { List> lists = new ArrayList<>(); @@ -295,7 +294,8 @@ class Solution { } } ``` -Python: + +## Python ```python class Solution: def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: @@ -315,10 +315,9 @@ class Solution: backtrack(candidates,target,0,0) return res ``` -Go: - -> 主要在于如何在回溯中去重 +## Go: +主要在于如何在回溯中去重 ```go func combinationSum2(candidates []int, target int) [][]int { @@ -359,7 +358,8 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int, } } ``` -javaScript: + +## javaScript: ```js /** @@ -392,7 +392,8 @@ var combinationSum2 = function(candidates, target) { } }; ``` -C: +## C + ```c int* path; int pathTop; diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 28867092..203d9b6f 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -117,7 +117,7 @@ class Solution { } ``` -Python: +Python3: ```python class Solution: def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: diff --git a/problems/0454.四数相加II.md b/problems/0454.四数相加II.md index 475f93a0..43b4070f 100644 --- a/problems/0454.四数相加II.md +++ b/problems/0454.四数相加II.md @@ -122,13 +122,6 @@ Python: ```python class Solution(object): def fourSumCount(self, nums1, nums2, nums3, nums4): - """ - :type nums1: List[int] - :type nums2: List[int] - :type nums3: List[int] - :type nums4: List[int] - :rtype: int - """ # use a dict to store the elements in nums1 and nums2 and their sum hashmap = dict() for n1 in nums1: @@ -147,27 +140,8 @@ class Solution(object): count += hashmap[key] return count -# 下面这个写法更为简洁,但是表达的是同样的算法 -# class Solution: -# def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: -# from collections import defaultdict - -# hashmap = defaultdict(int) - -# for x1 in nums1: -# for x2 in nums2: -# hashmap[x1+x2] += 1 - -# count=0 -# for x3 in nums3: -# for x4 in nums4: -# key = 0 - x3 - x4 -# value = hashmap[key] # 若差值(key)不存在,则value被赋值0 -# count += value -# return count - -``` +``` Go: ```go diff --git a/problems/0496.下一个更大元素I.md b/problems/0496.下一个更大元素I.md index 0c4fdd65..45824d82 100644 --- a/problems/0496.下一个更大元素I.md +++ b/problems/0496.下一个更大元素I.md @@ -271,4 +271,27 @@ func nextGreaterElement(nums1 []int, nums2 []int) []int { } ``` +JavaScript: + +```JS +var nextGreaterElement = function (nums1, nums2) { + let stack = []; + let map = new Map(); + for (let i = 0; i < nums2.length; i++) { + while (stack.length && nums2[i] > nums2[stack[stack.length - 1]]) { + let index = stack.pop(); + map.set(nums2[index], nums2[i]); + } + stack.push(i); + } + + let res = []; + for (let j = 0; j < nums1.length; j++) { + res[j] = map.get(nums1[j]) || -1; + } + + return res; +}; +``` +
diff --git a/problems/0673.最长递增子序列的个数.md b/problems/0673.最长递增子序列的个数.md index b3907e0e..653edadf 100644 --- a/problems/0673.最长递增子序列的个数.md +++ b/problems/0673.最长递增子序列的个数.md @@ -28,7 +28,7 @@ # 思路 -这道题可以说是 300.最长上升子序列 的进阶版本 +这道题可以说是 [300.最长上升子序列](https://programmercarl.com/0300.最长上升子序列.html) 的进阶版本 1. 确定dp数组(dp table)以及下标的含义 diff --git a/problems/知识星球精选/合适自己的就是最好的.md b/problems/知识星球精选/合适自己的就是最好的.md index 2f28483e..82ab8896 100644 --- a/problems/知识星球精选/合适自己的就是最好的.md +++ b/problems/知识星球精选/合适自己的就是最好的.md @@ -2,7 +2,7 @@ 秋招已经进入下半场了,不少同学也拿到了offer,但不是说非要进大厂,每个人情况都不一样,**合适自己的,就是最好的!**。 -知识星球里有一位录友,就终于拿到了合适自己的offer,并不是大厂,是南京的一家公司,**但很合适自己,其实就非常值得开心**。 +[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有一位录友,就终于拿到了合适自己的offer,并不是大厂,是南京的一家公司,**但很合适自己,其实就非常值得开心**。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910232502.png) @@ -28,5 +28,5 @@ 我在发文的时候 看了一遍她这几个月完整的打卡过程,还是深有感触的。 -星球里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 +[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 diff --git a/problems/知识星球精选/秋招下半场依然没offer.md b/problems/知识星球精选/秋招下半场依然没offer.md new file mode 100644 index 00000000..9800452c --- /dev/null +++ b/problems/知识星球精选/秋招下半场依然没offer.md @@ -0,0 +1,95 @@ + +# 秋招下半场依然没offer,怎么办? + +[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里一些录友拿到了满意的offer,也有一些录友,依然没有offer,每天的状态已经不能用焦虑来形容了。 + +在星球里就有录友向我提问了这样一个问题: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210921103222.png) + +估计还有公众号上还有很多录友也是这种情况,马上面试,但总感觉哪里都还没准备好,然后还必须要面试,每次面试结果还不理想。 + +能感受到此时大家非常迫切要知道还有没有什么切实可行的方案 ,只要执行 ,就能拿到offer。 + +恨不得提前知道面试官的问题,然后把问题都背下来得了。。。。 + +其实我是非常理解大家的心情的,这个时候怪自己准备的太晚也没有用。 + +说实话,已经是秋招下半场(接近末尾了),**已经没有针对面试的复习方案了。什么学习路线,突击计划 在这个时候 都没啥作用了**。 + +现在什么最重要呢? + +是**心态**。 + +心态要稳住,**放低预期,但别放低努力的程度**。 + +估计参加过面试的同学,都会有这种感觉,面试前一天复习,突击的内容,**第二天面试都不会考!是的,一道都不会考!** + +那么为什么还学呢? + +就是这股劲不能泄,只要憋住劲,每天面试,复盘,学习,面试再复盘,再学习,最终大家其实都能拿到offer的,只不过是offer的满意程度罢了。 + +**如果泄了劲,那就真没戏了**。 + +**可能自暴自弃两天,然后就发现自己啥也学不进去了**。 + +所以这个时候了,算法题还要一直刷,八股文也要背起来。 + +讲真,现在刷的题,看的八股文,面试可能也不一定会考,但为什么还要看呢,**就是稳定心态**。 + +**剩下的就看缘分了!** + +面试挺看缘分的, 可能一个面试官对你的评价就是基础不牢,下一家公司面试官对你的评价就是 基础不错,但项目经验不足。 + +所以此时你自己都蒙了,究竟自己是 基础不牢,还是项目经验不足呢? + +其实面试的本质,面试官主观性还是比较强的,可能就是问的几个问题 你都背过,而且背的很深入,那评价就是基础牢了呗。 + + +## 在学点技术,冲春招? + +[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里还有一位录友,也是类似的情况,秋招感觉很艰难,要不要在学一学微服务分布式之类的,再冲春招。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210921103343.png) + +其实这个时候,大家也不要再心思学点什么新技术,增加自己的筹码了。 + +还是那句话,**现在学啥,面试也未必会考!** + +就算 现在不参加秋招了,去学 微服务了,分布式。面试的时候 ,面试官未必会考不说,而且 你也未必学的透彻。 + +再说,春招的岗位 很少,而且优质岗位更少。 + +所以大家这个时候,就不要等了。 + +**直接海投,面试,复盘总结,再面试**。 + + +## 给参加明年秋招录友的劝告 + +其实我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,**看到了太多太多 参加今年秋招的录友 埋怨自己 准备的太晚了,没想到要看的东西这么多,没想到竞争这么激烈**。 + +所以明年参加秋招的录友,要提前就开始准备,明确自己的岗位,知道岗位的要求,制定自己的计划,然后按计划执行。 + +**其实多早开始准备,都不算早!** + +很多在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里的准大三,研一的录友,都能在星球里感受到 秋招的竞争与激烈。 + +所以他们也就早早的开始准备了。 + +来看看星球里 这位录友的提问,**他也才刚刚准大三,就已经为明年的秋招开始精心准备了**。 + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210920222600.png) + +估计大多数准大三或者准研一的同学都还没有这种意识。 + +**但在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,通过每天录友们的打卡,每天都能感受到这种紧迫感**。 + +正如一位星球里的录友这么说: + +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210920223847.png) + +很多录友加入星球之后,**刷贴吧刷剧已经不香了,只有刷星球!** + +感觉每天自己被push上去,其实有时候 **大家需要的就是一个氛围,自己一个人很难有提前准备的意识,也很难坚持下来**。 + From 3d61b13f9d7b0178aa66f4e352a27dc0ea51c61a Mon Sep 17 00:00:00 2001 From: baici1 <249337001@qq.com> Date: Thu, 23 Sep 2021 14:56:20 +0800 Subject: [PATCH 091/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0406.=20=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E8=BA=AB=E9=AB=98=E9=87=8D=E5=BB=BA=E9=98=9F=E5=88=97?= =?UTF-8?q?=20go=E7=89=88=E6=9C=AC=20=E9=93=BE=E8=A1=A8=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0406.根据身高重建队列.md | 33 ++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md index bd27b1b2..3c6ee63c 100644 --- a/problems/0406.根据身高重建队列.md +++ b/problems/0406.根据身高重建队列.md @@ -222,7 +222,7 @@ class Solution: ``` Go: -```golang +```go func reconstructQueue(people [][]int) [][]int { //先将身高从大到小排序,确定最大个子的相对位置 sort.Slice(people,func(i,j int)bool{ @@ -241,7 +241,38 @@ func reconstructQueue(people [][]int) [][]int { return result } ``` +```go +//链表法 +func reconstructQueue(people [][]int) [][]int { + sort.Slice(people,func (i,j int) bool { + if people[i][0]==people[j][0]{ + return people[i][1]people[j][0] + }) + l:=list.New()//创建链表 + for i:=0;i Date: Fri, 24 Sep 2021 11:04:24 +0800 Subject: [PATCH 092/222] Update --- problems/知识星球精选/HR面注意事项.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/problems/知识星球精选/HR面注意事项.md b/problems/知识星球精选/HR面注意事项.md index 5e0e9d65..c6e7c194 100644 --- a/problems/知识星球精选/HR面注意事项.md +++ b/problems/知识星球精选/HR面注意事项.md @@ -1,4 +1,9 @@ +

+ + + + # HR面注意事项 [知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里已经有一些录友开始准备HR面。 From 3221a854aba5bbe463a53dfeb946e5bc48300dc1 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Fri, 24 Sep 2021 11:06:03 +0800 Subject: [PATCH 093/222] Update --- README.md | 2 -- problems/0090.子集II.md | 4 +-- problems/0104.二叉树的最大深度.md | 22 +++++++------- .../0129.求根到叶子节点数字之和.md | 11 +++---- problems/0132.分割回文串II.md | 3 +- problems/0463.岛屿的周长.md | 2 +- problems/0494.目标和.md | 2 +- problems/0841.钥匙和房间.md | 7 +---- problems/二叉树理论基础.md | 9 ++---- problems/动态规划理论基础.md | 20 ++++--------- problems/回溯算法理论基础.md | 30 ++++++++----------- problems/贪心算法理论基础.md | 22 +++----------- 12 files changed, 49 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 82c28969..d1076aba 100644 --- a/README.md +++ b/README.md @@ -464,8 +464,6 @@ * [24.两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md) * [234.回文链表](./problems/0234.回文链表.md) * [143.重排链表](./problems/0143.重排链表.md)【数组】【双向队列】【直接操作链表】 - - * [141.环形链表](./problems/0141.环形链表.md) ## 哈希表 diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index c8cb42d3..5ab881e7 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -48,7 +48,7 @@ ## C++代码 -```c++ +```CPP class Solution { private: vector> result; @@ -83,7 +83,7 @@ public: ``` 使用set去重的版本。 -```c++ +```CPP class Solution { private: vector> result; diff --git a/problems/0104.二叉树的最大深度.md b/problems/0104.二叉树的最大深度.md index cde3d460..516cf5f1 100644 --- a/problems/0104.二叉树的最大深度.md +++ b/problems/0104.二叉树的最大深度.md @@ -42,14 +42,14 @@ 1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。 代码如下: -```c++ +```CPP int getdepth(treenode* node) ``` 2. 确定终止条件:如果为空节点的话,就返回0,表示高度为0。 代码如下: -```c++ +```CPP if (node == null) return 0; ``` @@ -57,7 +57,7 @@ if (node == null) return 0; 代码如下: -```c++ +```CPP int leftdepth = getdepth(node->left); // 左 int rightdepth = getdepth(node->right); // 右 int depth = 1 + max(leftdepth, rightdepth); // 中 @@ -66,7 +66,7 @@ return depth; 所以整体c++代码如下: -```c++ +```CPP class solution { public: int getdepth(treenode* node) { @@ -83,7 +83,7 @@ public: ``` 代码精简之后c++代码如下: -```c++ +```CPP class solution { public: int maxdepth(treenode* root) { @@ -99,7 +99,7 @@ public: 本题当然也可以使用前序,代码如下:(**充分表现出求深度回溯的过程**) -```c++ +```CPP class solution { public: int result; @@ -122,7 +122,7 @@ public: } int maxdepth(treenode* root) { result = 0; - if (root == 0) return result; + if (root == NULL) return result; getdepth(root, 1); return result; } @@ -133,7 +133,7 @@ public: 注意以上代码是为了把细节体现出来,简化一下代码如下: -```c++ +```CPP class solution { public: int result; @@ -171,7 +171,7 @@ public: c++代码如下: -```c++ +```CPP class solution { public: int maxdepth(treenode* root) { @@ -218,7 +218,7 @@ public: c++代码: -```c++ +```CPP class solution { public: int maxdepth(node* root) { @@ -235,7 +235,7 @@ public: 依然是层序遍历,代码如下: -```c++ +```CPP class solution { public: int maxdepth(node* root) { diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md index 7f50c885..696042a8 100644 --- a/problems/0129.求根到叶子节点数字之和.md +++ b/problems/0129.求根到叶子节点数字之和.md @@ -1,7 +1,8 @@ -## 链接 +# 129. 求根节点到叶节点数字之和 + [力扣题目链接](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/) -## 思路 +# 思路 本题和[113.路径总和II](https://programmercarl.com/0112.路径总和.html#_113-路径总和ii)是类似的思路,做完这道题,可以顺便把[113.路径总和II](https://programmercarl.com/0112.路径总和.html#_113-路径总和ii) 和 [112.路径总和](https://programmercarl.com/0112.路径总和.html#_112-路径总和) 做了。 @@ -15,7 +16,7 @@ 那么先按递归三部曲来分析: -### 递归三部曲 +## 递归三部曲 如果对递归三部曲不了解的话,可以看这里:[二叉树:前中后递归详解](https://programmercarl.com/二叉树的递归遍历.html) @@ -107,7 +108,7 @@ path.pop_back(); // 回溯 ``` **把回溯放在花括号外面了,世界上最遥远的距离,是你在花括号里,而我在花括号外!** 这就不对了。 -### 整体C++代码 +## 整体C++代码 关键逻辑分析完了,整体C++代码如下: @@ -160,7 +161,7 @@ public: **我这里提供的代码把整个回溯过程充分体现出来,希望可以帮助大家看的明明白白!** -## 其他语言版本 +# 其他语言版本 Java: diff --git a/problems/0132.分割回文串II.md b/problems/0132.分割回文串II.md index dbd830d0..f9cbd618 100644 --- a/problems/0132.分割回文串II.md +++ b/problems/0132.分割回文串II.md @@ -142,7 +142,8 @@ for (int i = 1; i < s.size(); i++) { 就是其实这两道题目的代码: -* 647.回文子串 + +* [647. 回文子串](https://programmercarl.com/0647.回文子串.html) * 5.最长回文子串 所以先用一个二维数组来保存整个字符串的回文情况。 diff --git a/problems/0463.岛屿的周长.md b/problems/0463.岛屿的周长.md index 609c25a5..fd9585d2 100644 --- a/problems/0463.岛屿的周长.md +++ b/problems/0463.岛屿的周长.md @@ -1,5 +1,5 @@ +# 463. 岛屿的周长 -## 题目链接 [力扣题目链接](https://leetcode-cn.com/problems/island-perimeter/) ## 思路 diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 87fc579d..c24ce6f9 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -158,7 +158,7 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[i]种方法 有哪些来源可以推出dp[j]呢? -不考虑nums[i]的情况下,填满容量为j - nums[i]的背包,有dp[j - nums[i]]种方法。 +填满容量为j - nums[i]的背包,有dp[j - nums[i]]种方法。 那么只要搞到nums[i]的话,凑成dp[j]就有dp[j - nums[i]] 种方法。 diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md index caa0edaf..d281dc5a 100644 --- a/problems/0841.钥匙和房间.md +++ b/problems/0841.钥匙和房间.md @@ -25,12 +25,7 @@ 示例 1: * 输入: [[1],[2],[3],[]] * 输出: true -* 解释: -我们从 0 号房间开始,拿到钥匙 1。 -之后我们去 1 号房间,拿到钥匙 2。 -然后我们去 2 号房间,拿到钥匙 3。 -最后我们去了 3 号房间。 -由于我们能够进入每个房间,我们返回 true。 +* 解释: 我们从 0 号房间开始,拿到钥匙 1。 之后我们去 1 号房间,拿到钥匙 2。 然后我们去 2 号房间,拿到钥匙 3。 最后我们去了 3 号房间。 由于我们能够进入每个房间,我们返回 true。 示例 2: * 输入:[[1,3],[3,0,1],[2],[0]] diff --git a/problems/二叉树理论基础.md b/problems/二叉树理论基础.md index 94a0d67f..b25f3be1 100644 --- a/problems/二叉树理论基础.md +++ b/problems/二叉树理论基础.md @@ -8,7 +8,9 @@ # 二叉树理论基础篇 -我们要开启新的征程了,大家跟上! +题目分类大纲如下: + +二叉树大纲 说道二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容在啰嗦一遍,所以一下我讲的都是一些比较重点的内容。 @@ -179,11 +181,6 @@ struct TreeNode { **说道二叉树,就不得不说递归,很多同学对递归都是又熟悉又陌生,递归的代码一般很简短,但每次都是一看就会,一写就废。** - - - - - ## 其他语言版本 diff --git a/problems/动态规划理论基础.md b/problems/动态规划理论基础.md index fd7977a6..bd46586f 100644 --- a/problems/动态规划理论基础.md +++ b/problems/动态规划理论基础.md @@ -6,6 +6,12 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 动态规划理论基础 + +动态规划刷题大纲 + + + ## 什么是动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 @@ -122,20 +128,6 @@ 今天我们开始新的征程了,你准备好了么? -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - - - ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) diff --git a/problems/回溯算法理论基础.md b/problems/回溯算法理论基础.md index 29981c66..c351ddba 100644 --- a/problems/回溯算法理论基础.md +++ b/problems/回溯算法理论基础.md @@ -6,10 +6,15 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 回溯算法理论基础 -> 可以配合我的B站视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/) 一起学习! +## 题目分类大纲如下: -# 什么是回溯法 +回溯算法大纲 + +可以配合我的B站视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/) 一起学习! + +## 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 @@ -19,7 +24,7 @@ **所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数**。 -# 回溯法的效率 +## 回溯法的效率 回溯法的性能如何呢,这里要和大家说清楚了,**虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法**。 @@ -31,7 +36,7 @@ 此时大家应该好奇了,都什么问题,这么牛逼,只能暴力搜索。 -# 回溯法解决的问题 +## 回溯法解决的问题 回溯法,一般可以解决如下几种问题: @@ -52,7 +57,7 @@ 记住组合无序,排列有序,就可以了。 -# 如何理解回溯法 +## 如何理解回溯法 **回溯法解决的问题都可以抽象为树形结构**,是的,我指的是所有回溯法的问题都可以抽象为树形结构! @@ -63,7 +68,7 @@ 这块可能初学者还不太理解,后面的回溯算法解决的所有题目中,我都会强调这一点并画图举相应的例子,现在有一个印象就行。 -# 回溯法模板 +## 回溯法模板 这里给出Carl总结的回溯算法模板。 @@ -149,7 +154,7 @@ void backtracking(参数) { 如果从来没有学过回溯算法的录友们,看到这里会有点懵,后面开始讲解具体题目的时候就会好一些了,已经做过回溯法题目的录友,看到这里应该会感同身受了。 -# 总结 +## 总结 本篇我们讲解了,什么是回溯算法,知道了回溯和递归是相辅相成的。 @@ -163,17 +168,6 @@ void backtracking(参数) { -## 其他语言版本 - - -Java: - - -Python: - - -Go: - diff --git a/problems/贪心算法理论基础.md b/problems/贪心算法理论基础.md index fdb7abf3..9c131709 100644 --- a/problems/贪心算法理论基础.md +++ b/problems/贪心算法理论基础.md @@ -9,8 +9,10 @@ # 关于贪心算法,你该了解这些! -> 正式开始新的系列了,贪心算法! -通知:一些录友表示经常看不到每天的文章,现在公众号已经不按照发送时间推荐了,而是根据一些规则乱序推送,所以可能关注了「代码随想录」也一直看不到文章,建议把「代码随想录」设置星标哈,设置星标之后,每天就按发文时间推送了,我每天都是定时8:35发送的,嗷嗷准时,哈哈。 +题目分类大纲如下: + +贪心算法大纲 + ## 什么是贪心 @@ -88,22 +90,6 @@ - - -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - - - ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From 431b5a7e02fcd233c34dd70ed232bce6d2c7c401 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 24 Sep 2021 15:59:16 +0800 Subject: [PATCH 094/222] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200704=20=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=20JavaScript=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原解法逻辑不够简洁清晰,简单问题被其复杂化,所以我提出个人认为更简洁清晰的解法 --- problems/0704.二分查找.md | 49 +++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index f358d2be..67809000 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -283,31 +283,46 @@ func search(nums []int, target int) int { // (版本一)左闭右闭区间 +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ var search = function(nums, target) { - let l = 0, r = nums.length - 1; - // 区间 [l, r] - while(l <= r) { - let mid = (l + r) >> 1; - if(nums[mid] === target) return mid; - let isSmall = nums[mid] < target; - l = isSmall ? mid + 1 : l; - r = isSmall ? r : mid - 1; + let left = 0, right = nums.length; + // 使用左闭右开区间 [left, right) + while (left < right) { + let mid = left + Math.floor((right - left)/2); + if (nums[mid] > target) { + right = mid; // 去左区间寻找 + } else if (nums[mid] < target) { + left = mid + 1; // 去右区间寻找 + } else { + return mid; + } } return -1; }; // (版本二)左闭右开区间 +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ var search = function(nums, target) { - let l = 0, r = nums.length; - // 区间 [l, r) - while(l < r) { - let mid = (l + r) >> 1; - if(nums[mid] === target) return mid; - let isSmall = nums[mid] < target; - l = isSmall ? mid + 1 : l; - // 所以 mid 不会被取到 - r = isSmall ? r : mid; + let left = 0, right = nums.length; + // 使用左闭右开区间 [left, right) + while (left < right) { + let mid = left + Math.floor((right - left)/2); + if (nums[mid] > target) { + right = mid; // 去左区间寻找 + } else if (nums[mid] < target) { + left = mid + 1; // 去右区间寻找 + } else { + return mid; + } } return -1; }; From b4e6579793199a9a184a3d91f6022b0be65c4ae7 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 24 Sep 2021 16:45:41 +0800 Subject: [PATCH 095/222] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200059=20=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=20JavaScript=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 提供一种条理更清晰的方法,与本文介绍的解法更吻合 --- problems/0059.螺旋矩阵II.md | 59 +++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 9a7dc850..733ec749 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -239,45 +239,54 @@ class Solution: javaScript -```js +```javascript /** * @param {number} n * @return {number[][]} */ var generateMatrix = function(n) { - // new Array(n).fill(new Array(n)) - // 使用fill --> 填充的是同一个数组地址 - const res = Array.from({length: n}).map(() => new Array(n)); - let loop = n >> 1, i = 0, //循环次数 - count = 1, - startX = startY = 0; // 起始位置 - while(++i <= loop) { - // 定义行列 - let row = startX, column = startY; - // [ startY, n - i) - while(column < n - i) { - res[row][column++] = count++; + let startX = startY = 0; // 起始位置 + let loop = Math.floor(n/2); // 旋转圈数 + let mid = Math.floor(n/2); // 中间位置 + let offset = 1; // 控制每一层填充元素个数 + let count = 1; // 更新填充数字 + let res = new Array(n).fill(0).map(() => new Array(n).fill(0)); + + while (loop--) { + let row = startX, col = startY; + // 上行从左到右(左闭右开) + for (; col < startY + n - offset; col++) { + res[row][col] = count++; } - // [ startX, n - i) - while(row < n - i) { - res[row++][column] = count++; + // 右列从上到下(左闭右开) + for (; row < startX + n - offset; row++) { + res[row][col] = count++; } - // [n - i , startY) - while(column > startY) { - res[row][column--] = count++; + // 下行从右到左(左闭右开) + for (; col > startX; col--) { + res[row][col] = count++; } - // [n - i , startX) - while(row > startX) { - res[row--][column] = count++; + // 左列做下到上(左闭右开) + for (; row > startY; row--) { + res[row][col] = count++; } - startX = ++startY; + + // 更新起始位置 + startX++; + startY++; + + // 更新offset + offset += 2; } - if(n & 1) { - res[startX][startY] = count; + // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值 + if (n % 2 === 1) { + res[mid][mid] = count; } return res; }; + + ``` Go: From 59eff2e01b24169c168e96e685c0fd00c3be8ab9 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 25 Sep 2021 09:27:29 +0800 Subject: [PATCH 096/222] =?UTF-8?q?=E8=A1=A5=E5=85=85=200202=20=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=95=B0=20=20JavaScript=E7=89=88=E6=9C=AC=E4=BD=BF?= =?UTF-8?q?=E7=94=A8Set()=20=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0202.快乐数.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/problems/0202.快乐数.md b/problems/0202.快乐数.md index 02db507a..43c9d753 100644 --- a/problems/0202.快乐数.md +++ b/problems/0202.快乐数.md @@ -191,6 +191,30 @@ var isHappy = function(n) { } return b === 1 || getN(b) === 1 ; }; + +// 方法三:使用Set()更简洁 +/** + * @param {number} n + * @return {boolean} + */ + +var getSum = function (n) { + let sum = 0; + while (n) { + sum += (n % 10) ** 2; + n = Math.floor(n/10); + } + return sum; +} +var isHappy = function(n) { + let set = new Set(); // Set() 里的数是惟一的 + // 如果在循环中某个值重复出现,说明此时陷入死循环,也就说明这个值不是快乐数 + while (n !== 1 && !set.has(n)) { + set.add(n); + n = getSum(n); + } + return n === 1; +}; ``` Swift: From 76b236a5889b1cf7724467e00709690355922816 Mon Sep 17 00:00:00 2001 From: DoubleYellowIce <65336599+DoubleYellowIce@users.noreply.github.com> Date: Sat, 25 Sep 2021 16:46:53 +0800 Subject: [PATCH 097/222] =?UTF-8?q?Update=200122.=E4=B9=B0=E5=8D=96?= =?UTF-8?q?=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA?= =?UTF-8?q?II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 推测作者意图本意是“如何“ --- problems/0122.买卖股票的最佳时机II.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 4bbe9e5e..c1b3ee7e 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -52,7 +52,7 @@ **如果想到其实最终利润是可以分解的,那么本题就很容易了!** -如果分解呢? +如何分解呢? 假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。 From 4a924b62baad79a45121be27318ea04036846df4 Mon Sep 17 00:00:00 2001 From: 20200203127 <846169622@qq.com> Date: Sat, 25 Sep 2021 17:40:17 +0800 Subject: [PATCH 098/222] =?UTF-8?q?=E5=8A=A0=E5=85=A5python=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E5=8F=8C=E6=8C=87=E9=92=88=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0005.最长回文子串.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md index c78b827c..d9ddcc60 100644 --- a/problems/0005.最长回文子串.md +++ b/problems/0005.最长回文子串.md @@ -288,7 +288,34 @@ class Solution: return s[left:right + 1] ``` +> 双指针法: +```python +class Solution: + def longestPalindrome(self, s: str) -> str: + def find_point(i, j, s): + while i >= 0 and j < len(s) and s[i] == s[j]: + i -= 1 + j += 1 + return i + 1, j + + def compare(start, end, left, right): + if right - left > end - start: + return left, right + else: + return start, end + + start = 0 + end = 0 + for i in range(len(s)): + left, right = find_point(i, i, s) + start, end = compare(start, end, left, right) + + left, right = find_point(i, i + 1, s) + start, end = compare(start, end, left, right) + return s[start:end] + +``` ## Go ```go From a2f7147a9386ca8949cc4774c0ea6e57468119b3 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 25 Sep 2021 20:08:41 +0800 Subject: [PATCH 099/222] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200107=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86II=20Java?= =?UTF-8?q?Script=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 选择从数组前头插入数值,避免最后反转数组的操作,减少计算时间 --- problems/0102.二叉树的层序遍历.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 5128d6ec..7c43a472 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -421,9 +421,10 @@ var levelOrderBottom = function(root) { node.left&&queue.push(node.left); node.right&&queue.push(node.right); } - res.push(curLevel); + // 从数组前头插入值,避免最后反转数组,减少运算时间 + res.unshift(curLevel); } - return res.reverse(); + return res; }; ``` From 44019c84ab0e583d55714472ae6f5131b77a6286 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 25 Sep 2021 20:23:52 +0800 Subject: [PATCH 100/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200116=20=E5=A1=AB?= =?UTF-8?q?=E5=86=99=E6=AF=8F=E4=B8=80=E4=B8=AA=E8=8A=82=E7=82=B9=E5=8F=91?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E6=8C=87=E9=92=88?= =?UTF-8?q?=20JavaScript=E7=89=88=E6=9C=AC=20=E8=A7=A3=E6=B3=95=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 0116 填写每一个节点发下一个右侧指针 JavaScript版本 解法代码 --- problems/0102.二叉树的层序遍历.md | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 5128d6ec..79d3547d 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1263,7 +1263,41 @@ class Solution: first = first.left # 从本层扩展到下一层 return root ``` +JavaScript: +```javascript +/** + * // Definition for a Node. + * function Node(val, left, right, next) { + * this.val = val === undefined ? null : val; + * this.left = left === undefined ? null : left; + * this.right = right === undefined ? null : right; + * this.next = next === undefined ? null : next; + * }; + */ + +/** + * @param {Node} root + * @return {Node} + */ +var connect = function(root) { + if (root === null) return root; + let queue = [root]; + while (queue.length) { + let n = queue.length; + for (let i=0; i Date: Sat, 25 Sep 2021 20:34:22 +0800 Subject: [PATCH 101/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20117=E9=A2=98?= =?UTF-8?q?=E3=80=81104=E9=A2=98=E3=80=81111=E9=A2=98=E7=AD=89=20JavaScrip?= =?UTF-8?q?t=E7=89=88=E6=9C=AC=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 117.填充每个节点的下一个右侧节点指针II JavaScript版本解法代码 新增 104二叉树最大深度 JavaScript版本解法代码 新增 111.二叉树的最小深度 JavaScript版本解法代码 --- problems/0102.二叉树的层序遍历.md | 97 ++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 5128d6ec..330a4f62 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1426,7 +1426,39 @@ class Solution: first = dummyHead.next # 此处为换行操作,更新到下一行 return root ``` +JavaScript: +```javascript +/** + * // Definition for a Node. + * function Node(val, left, right, next) { + * this.val = val === undefined ? null : val; + * this.left = left === undefined ? null : left; + * this.right = right === undefined ? null : right; + * this.next = next === undefined ? null : next; + * }; + */ +/** + * @param {Node} root + * @return {Node} + */ +var connect = function(root) { + if (root === null) { + return null; + } + let queue = [root]; + while (queue.length > 0) { + let n = queue.length; + for (let i=0; i Date: Sun, 26 Sep 2021 09:26:26 +0800 Subject: [PATCH 102/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20100=20=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E6=A0=91=E3=80=81257=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF=E5=BE=84=20=20?= =?UTF-8?q?=E4=B8=A4=E9=A2=98=E7=9A=84JavaScript=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 100 相同的树、257 二叉树的所有路径 两题的JavaScript版本代码 --- problems/二叉树中递归带着回溯.md | 75 ++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/problems/二叉树中递归带着回溯.md b/problems/二叉树中递归带着回溯.md index 7b0ccad7..3c17e777 100644 --- a/problems/二叉树中递归带着回溯.md +++ b/problems/二叉树中递归带着回溯.md @@ -439,9 +439,84 @@ func traversal(root *TreeNode,result *[]string,path *[]int){ } ``` +JavaScript: +100.相同的树 +```javascript +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} p + * @param {TreeNode} q + * @return {boolean} + */ +var isSameTree = function(p, q) { + if (p === null && q === null) { + return true; + } else if (p === null || q === null) { + return false; + } else if (p.val !== q.val) { + return false; + } else { + return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); + } +}; +``` +257.二叉树的不同路径 +> 回溯法: + +```javascript +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {string[]} + */ +var binaryTreePaths = function(root) { + const getPath = (root, path, result) => { + path.push(root.val); + if (root.left === null && root.right === null) { + let n = path.length; + let str = ''; + for (let i=0; i'; + } + str += path[n-1]; + result.push(str); + } + + if (root.left !== null) { + getPath(root.left, path, result); + path.pop(); // 回溯 + } + + if (root.right !== null) { + getPath(root.right, path, result); + path.pop(); + } + } + + if (root === null) return []; + let result = []; + let path = []; + getPath(root, path, result); + return result; +}; +``` ----------------------- From 051321077ffecdb3a0cfe1c18333c7cc46067e40 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Sun, 26 Sep 2021 10:38:56 +0800 Subject: [PATCH 103/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200617.=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E4=BA=8C=E5=8F=89=E6=A0=91=20=20=20JavaScript=20?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E6=B3=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0617.合并二叉树.md | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/problems/0617.合并二叉树.md b/problems/0617.合并二叉树.md index e21efcb3..80200c03 100644 --- a/problems/0617.合并二叉树.md +++ b/problems/0617.合并二叉树.md @@ -507,6 +507,8 @@ func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode { ## JavaScript +> 递归法: + ```javascript /** * Definition for a binary tree node. @@ -535,6 +537,53 @@ var mergeTrees = function (root1, root2) { return preOrder(root1, root2); }; ``` +> 迭代法: + +```javascript + +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root1 + * @param {TreeNode} root2 + * @return {TreeNode} + */ +var mergeTrees = function(root1, root2) { + if (root1 === null) return root2; + if (root2 === null) return root1; + + let queue = []; + queue.push(root1); + queue.push(root2); + while (queue.length) { + let node1 = queue.shift(); + let node2 = queue.shift();; + node1.val += node2.val; + if (node1.left !== null && node2.left !== null) { + queue.push(node1.left); + queue.push(node2.left); + } + if (node1.right !== null && node2.right !== null) { + queue.push(node1.right); + queue.push(node2.right); + } + if (node1.left === null && node2.left !== null) { + node1.left = node2.left; + } + if (node1.right === null && node2.right !== null) { + node1.right = node2.right; + } + } + return root1; +}; + +``` ----------------------- From 769e88bb110734b306b61769ba8d0f96a58d4191 Mon Sep 17 00:00:00 2001 From: Qxiaoqi Date: Sun, 26 Sep 2021 17:01:50 +0800 Subject: [PATCH 104/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200707.=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E9=93=BE=E8=A1=A8=20TypeScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0707.设计链表.md | 115 ++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md index e05165a9..601161e0 100644 --- a/problems/0707.设计链表.md +++ b/problems/0707.设计链表.md @@ -880,6 +880,121 @@ MyLinkedList.prototype.deleteAtIndex = function(index) { * obj.deleteAtIndex(index) */ ``` + +TypeScript: +```TypeScript +class ListNode { + public val: number; + public next: ListNode | null; + constructor(val?: number, next?: ListNode | null) { + this.val = val === undefined ? 0 : val; + this.next = next === undefined ? null : next; + } +} + +class MyLinkedList { + // 记录链表长度 + private size: number; + private head: ListNode | null; + private tail: ListNode | null; + constructor() { + this.size = 0; + this.head = null; + this.tail = null; + } + + // 获取链表中第 index个节点的值 + get(index: number): number { + // 索引无效的情况 + if (index < 0 || index >= this.size) { + return -1; + } + let curNode = this.getNode(index); + // 这里在前置条件下,理论上不会出现 null的情况 + return curNode.val; + } + + // 在链表的第一个元素之前添加一个值为 val的节点。插入后,新节点将成为链表的第一个节点。 + addAtHead(val: number): void { + let node: ListNode = new ListNode(val, this.head); + this.head = node; + if (!this.tail) { + this.tail = node; + } + this.size++; + } + + // 将值为 val 的节点追加到链表的最后一个元素。 + addAtTail(val: number): void { + let node: ListNode = new ListNode(val, null); + if (this.tail) { + this.tail.next = node; + } else { + // 还没有尾节点,说明一个节点都还没有 + this.head = node; + } + this.tail = node; + this.size++; + } + + // 在链表中的第 index个节点之前添加值为 val的节点。 + // 如果 index等于链表的长度,则该节点将附加到链表的末尾。如果 index大于链表长度,则不会插入节点。如果 index小于0,则在头部插入节点。 + addAtIndex(index: number, val: number): void { + if (index === this.size) { + this.addAtTail(val); + return; + } + if (index > this.size) { + return; + } + // <= 0 的情况都是在头部插入 + if (index <= 0) { + this.addAtHead(val); + return; + } + // 正常情况 + // 获取插入位置的前一个 node + let curNode = this.getNode(index - 1); + let node: ListNode = new ListNode(val, curNode.next); + curNode.next = node; + this.size++; + } + + // 如果索引 index有效,则删除链表中的第 index个节点。 + deleteAtIndex(index: number): void { + if (index < 0 || index >= this.size) { + return; + } + // 处理头节点 + if (index === 0) { + this.head = this.head!.next; + this.size--; + return; + } + // 索引有效 + let curNode: ListNode = this.getNode(index - 1); + curNode.next = curNode.next!.next; + // 处理尾节点 + if (index === this.size - 1) { + this.tail = curNode; + } + this.size--; + } + + // 获取指定 Node节点 + private getNode(index: number): ListNode { + // 这里不存在没办法获取到节点的情况,都已经在前置方法做过判断 + // 创建虚拟头节点 + let curNode: ListNode = new ListNode(0, this.head); + for (let i = 0; i <= index; i++) { + // 理论上不会出现 null + curNode = curNode.next!; + } + return curNode; + } +} +``` + Kotlin: ```kotlin class MyLinkedList { From 60097fe7bf6556c2e5c170b58fc1827b83fa0d45 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 27 Sep 2021 00:14:53 +0800 Subject: [PATCH 105/222] Update --- problems/0131.分割回文串.md | 21 +++++++++---------- .../0583.两个字符串的删除操作.md | 2 +- .../知识星球精选/HR面注意事项.md | 6 +++--- .../知识星球精选/不一样的七夕.md | 4 ++++ .../不少录友想放弃秋招.md | 5 +++++ .../专业技能可以这么写.md | 7 +++++++ .../关于实习大家的疑问.md | 4 ++++ .../关于提前批的一些建议.md | 4 ++++ .../写简历的一些问题.md | 5 +++++ .../刷力扣用不用库函数.md | 5 +++++ .../刷题攻略要刷两遍.md | 5 +++++ .../博士转行计算机.md | 5 +++++ .../合适自己的就是最好的.md | 5 +++++ .../知识星球精选/备战2022届秋招.md | 5 +++++ .../大厂新人培养体系.md | 5 +++++ .../如何权衡实习与秋招复习.md | 4 ++++ problems/知识星球精选/客三消.md | 4 ++++ .../技术不好如何选择技术方向.md | 4 ++++ .../提前批已经开始了.md | 6 ++++++ .../秋招下半场依然没offer.md | 4 ++++ .../知识星球精选/秋招的上半场.md | 4 ++++ .../秋招进行中的迷茫与焦虑.md | 5 +++++ .../英语到底重不重要.md | 5 +++++ .../知识星球精选/要不要考研.md | 5 +++++ .../面试中发散性问题.md | 5 +++++ problems/背包理论基础01背包-1.md | 2 +- 26 files changed, 120 insertions(+), 16 deletions(-) diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index f2e108e8..08f091aa 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -9,7 +9,7 @@ > 切割问题其实是一种组合问题! -## 131.分割回文串 +# 131.分割回文串 [力扣题目链接](https://leetcode-cn.com/problems/palindrome-partitioning/) @@ -26,7 +26,7 @@ ] -## 思路 +# 思路 关于本题,大家也可以看我在B站的视频讲解:[131.分割回文串(B站视频)](https://www.bilibili.com/video/BV1c54y1e7k6) @@ -210,7 +210,7 @@ public: }; ``` -## 总结 +# 总结 这道题目在leetcode上是中等,但可以说是hard的题目了,但是代码其实就是按照模板的样子来的。 @@ -244,12 +244,10 @@ public: +# 其他语言版本 -## 其他语言版本 - - -Java: +## Java ```Java class Solution { List> lists = new ArrayList<>(); @@ -291,7 +289,7 @@ class Solution { } ``` -Python: +## Python ```python # 版本一 class Solution: @@ -341,8 +339,9 @@ class Solution: backtrack(s, 0) return res ``` -Go: -> 注意切片(go切片是披着值类型外衣的引用类型) +## Go + +注意切片(go切片是披着值类型外衣的引用类型) ```go func partition(s string) [][]string { @@ -387,7 +386,7 @@ func isPartition(s string,startIndex,end int)bool{ } ``` -javaScript: +## javaScript ```js /** diff --git a/problems/0583.两个字符串的删除操作.md b/problems/0583.两个字符串的删除操作.md index 91b07ca9..079b2028 100644 --- a/problems/0583.两个字符串的删除操作.md +++ b/problems/0583.两个字符串的删除操作.md @@ -52,7 +52,7 @@ dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word 从递推公式中,可以看出来,dp[i][0] 和 dp[0][j]是一定要初始化的。 -dp[i][0]:word2为空字符串,以i-1为结尾的字符串word2要删除多少个元素,才能和word1相同呢,很明显dp[i][0] = i。 +dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = i。 dp[0][j]的话同理,所以代码如下: diff --git a/problems/知识星球精选/HR面注意事项.md b/problems/知识星球精选/HR面注意事项.md index c6e7c194..6a0a26f1 100644 --- a/problems/知识星球精选/HR面注意事项.md +++ b/problems/知识星球精选/HR面注意事项.md @@ -1,9 +1,9 @@ -

- - + + + # HR面注意事项 [知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里已经有一些录友开始准备HR面。 diff --git a/problems/知识星球精选/不一样的七夕.md b/problems/知识星球精选/不一样的七夕.md index 37e1c2da..a670e078 100644 --- a/problems/知识星球精选/不一样的七夕.md +++ b/problems/知识星球精选/不一样的七夕.md @@ -1,3 +1,7 @@ +

+ + + # 特殊的七夕 diff --git a/problems/知识星球精选/不少录友想放弃秋招.md b/problems/知识星球精选/不少录友想放弃秋招.md index 4807dd97..721a9313 100644 --- a/problems/知识星球精选/不少录友想放弃秋招.md +++ b/problems/知识星球精选/不少录友想放弃秋招.md @@ -1,3 +1,8 @@ +

+ + + + # 不少录友想放弃秋招了..... 马上就要九月份了,互联网大厂的秋招的序幕早已拉开。 diff --git a/problems/知识星球精选/专业技能可以这么写.md b/problems/知识星球精选/专业技能可以这么写.md index 51522b9f..dd616713 100644 --- a/problems/知识星球精选/专业技能可以这么写.md +++ b/problems/知识星球精选/专业技能可以这么写.md @@ -1,3 +1,10 @@ +

+ + + + + + # 你简历里的「专业技能」写的够专业么? diff --git a/problems/知识星球精选/关于实习大家的疑问.md b/problems/知识星球精选/关于实习大家的疑问.md index 118d8bf1..5d4e695b 100644 --- a/problems/知识星球精选/关于实习大家的疑问.md +++ b/problems/知识星球精选/关于实习大家的疑问.md @@ -1,3 +1,7 @@ +

+ + + # 关于实习,大家可能有点迷茫! diff --git a/problems/知识星球精选/关于提前批的一些建议.md b/problems/知识星球精选/关于提前批的一些建议.md index fcf41a7e..415a8b2f 100644 --- a/problems/知识星球精选/关于提前批的一些建议.md +++ b/problems/知识星球精选/关于提前批的一些建议.md @@ -1,3 +1,7 @@ +

+ + + # 秋招和提前批都越来越提前了.... diff --git a/problems/知识星球精选/写简历的一些问题.md b/problems/知识星球精选/写简历的一些问题.md index 513f86ba..af42cea1 100644 --- a/problems/知识星球精选/写简历的一些问题.md +++ b/problems/知识星球精选/写简历的一些问题.md @@ -1,3 +1,8 @@ +

+ + + + # 程序员应该这么写简历! 自运营[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 diff --git a/problems/知识星球精选/刷力扣用不用库函数.md b/problems/知识星球精选/刷力扣用不用库函数.md index 1a613b8d..07db8564 100644 --- a/problems/知识星球精选/刷力扣用不用库函数.md +++ b/problems/知识星球精选/刷力扣用不用库函数.md @@ -1,3 +1,8 @@ +

+ + + + # 究竟什么时候用库函数,什么时候要自己实现 在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有录友问我,刷题究竟要不要用库函数? 刷题的时候总是禁不住库函数的诱惑,如果都不用库函数一些题目做起来还很麻烦。 diff --git a/problems/知识星球精选/刷题攻略要刷两遍.md b/problems/知识星球精选/刷题攻略要刷两遍.md index 53907ee8..1f4fd7f9 100644 --- a/problems/知识星球精选/刷题攻略要刷两遍.md +++ b/problems/知识星球精选/刷题攻略要刷两遍.md @@ -1,3 +1,8 @@ +

+ + + + # 代码随想录上的题目最好刷两遍以上 今天秋招可能要提前很多,往年9月份开始秋招,今天可能9月份就已经结束了,所以 正在准备秋招的录友,还是要抓紧时间了。。 diff --git a/problems/知识星球精选/博士转行计算机.md b/problems/知识星球精选/博士转行计算机.md index cb73804e..66769264 100644 --- a/problems/知识星球精选/博士转行计算机.md +++ b/problems/知识星球精选/博士转行计算机.md @@ -1,3 +1,8 @@ +

+ + + + # 本硕非计算机博士,如果找计算机相关工作 在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 diff --git a/problems/知识星球精选/合适自己的就是最好的.md b/problems/知识星球精选/合适自己的就是最好的.md index 82ab8896..fda51afa 100644 --- a/problems/知识星球精选/合适自己的就是最好的.md +++ b/problems/知识星球精选/合适自己的就是最好的.md @@ -1,3 +1,8 @@ +

+ + + + # 合适自己的,才是最好的! 秋招已经进入下半场了,不少同学也拿到了offer,但不是说非要进大厂,每个人情况都不一样,**合适自己的,就是最好的!**。 diff --git a/problems/知识星球精选/备战2022届秋招.md b/problems/知识星球精选/备战2022届秋招.md index 383f5742..207a5e2a 100644 --- a/problems/知识星球精选/备战2022届秋招.md +++ b/problems/知识星球精选/备战2022届秋招.md @@ -1,3 +1,8 @@ +

+ + + + # 要开始准备2022届的秋招了 在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 diff --git a/problems/知识星球精选/大厂新人培养体系.md b/problems/知识星球精选/大厂新人培养体系.md index 165406f8..ccd2f1c2 100644 --- a/problems/知识星球精选/大厂新人培养体系.md +++ b/problems/知识星球精选/大厂新人培养体系.md @@ -1,3 +1,8 @@ +

+ + + + # 大厂的新人培养体系是什么样的 之前我一直在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)和大家讲,能进大厂一定要进大厂,大厂有比较好的培养体系。 diff --git a/problems/知识星球精选/如何权衡实习与秋招复习.md b/problems/知识星球精选/如何权衡实习与秋招复习.md index ee2fbd24..275588df 100644 --- a/problems/知识星球精选/如何权衡实习与秋招复习.md +++ b/problems/知识星球精选/如何权衡实习与秋招复习.md @@ -1,3 +1,7 @@ +

+ + + # 已经在实习的录友如何准备秋招? diff --git a/problems/知识星球精选/客三消.md b/problems/知识星球精选/客三消.md index 869d39de..8a7b5fc6 100644 --- a/problems/知识星球精选/客三消.md +++ b/problems/知识星球精选/客三消.md @@ -1,3 +1,7 @@ +

+ + + # 客三消! diff --git a/problems/知识星球精选/技术不好如何选择技术方向.md b/problems/知识星球精选/技术不好如何选择技术方向.md index ad8a777c..dd13f46b 100644 --- a/problems/知识星球精选/技术不好如何选择技术方向.md +++ b/problems/知识星球精选/技术不好如何选择技术方向.md @@ -1,3 +1,7 @@ +

+ + + # 技术不太好,也不知道对技术有没有兴趣,我该怎么选? diff --git a/problems/知识星球精选/提前批已经开始了.md b/problems/知识星球精选/提前批已经开始了.md index ec8ede8e..ba05b5a9 100644 --- a/problems/知识星球精选/提前批已经开始了.md +++ b/problems/知识星球精选/提前批已经开始了.md @@ -1,3 +1,9 @@ +

+ + + + +# 不知不觉华为提前提已经开始了 最近华为提前批已经开始了,不少同学已经陆续参加了提前批的面试。 diff --git a/problems/知识星球精选/秋招下半场依然没offer.md b/problems/知识星球精选/秋招下半场依然没offer.md index 9800452c..829f82ba 100644 --- a/problems/知识星球精选/秋招下半场依然没offer.md +++ b/problems/知识星球精选/秋招下半场依然没offer.md @@ -1,3 +1,7 @@ +

+ + + # 秋招下半场依然没offer,怎么办? diff --git a/problems/知识星球精选/秋招的上半场.md b/problems/知识星球精选/秋招的上半场.md index 8ba938ea..f404e611 100644 --- a/problems/知识星球精选/秋招的上半场.md +++ b/problems/知识星球精选/秋招的上半场.md @@ -1,3 +1,7 @@ +

+ + + # 秋招上半场的总结 diff --git a/problems/知识星球精选/秋招进行中的迷茫与焦虑.md b/problems/知识星球精选/秋招进行中的迷茫与焦虑.md index bdd59d4f..6083c7b1 100644 --- a/problems/知识星球精选/秋招进行中的迷茫与焦虑.md +++ b/problems/知识星球精选/秋招进行中的迷茫与焦虑.md @@ -1,3 +1,8 @@ +

+ + + + # 秋招进行时,其实大家都很焦虑 大家应该都发现了,提前批和秋招都越来越提前的,大部分的录友此时的心态还是挺焦虑的。 diff --git a/problems/知识星球精选/英语到底重不重要.md b/problems/知识星球精选/英语到底重不重要.md index d1f647c0..32e6a39b 100644 --- a/problems/知识星球精选/英语到底重不重要.md +++ b/problems/知识星球精选/英语到底重不重要.md @@ -1,3 +1,8 @@ +

+ + + + # 对程序员来说,英语到底重不重要 在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)有一位录友问了我这么一个问题。 diff --git a/problems/知识星球精选/要不要考研.md b/problems/知识星球精选/要不要考研.md index d67b95b7..a5f2dfa0 100644 --- a/problems/知识星球精选/要不要考研.md +++ b/problems/知识星球精选/要不要考研.md @@ -1,3 +1,8 @@ +

+ + + + # 到底要不要读研 在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里讨论了一下关于要不要读研的问题。 diff --git a/problems/知识星球精选/面试中发散性问题.md b/problems/知识星球精选/面试中发散性问题.md index 550b51d2..7fb9150f 100644 --- a/problems/知识星球精选/面试中发散性问题.md +++ b/problems/知识星球精选/面试中发散性问题.md @@ -1,3 +1,8 @@ +

+ + + + # 面试中遇到发散性问题,应该怎么办? 这周在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)有一位录友问了我这么一个问题,我感觉挺有代表性的,应该不少录友在面试中不论是社招还是校招都会遇到这一类的问题。 diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index 32ad30d3..030c00d2 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -123,7 +123,7 @@ for (int j = weight[0]; j <= bagWeight; j++) { dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化多少呢? -其实从递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出dp[i][j] 是又左上方数值推导出来了,那么 其他下标初始为什么数值都可以,因为都会被覆盖。 +其实从递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出dp[i][j] 是由左上方数值推导出来了,那么 其他下标初始为什么数值都可以,因为都会被覆盖。 **初始-1,初始-2,初始100,都可以!** From f7990b703ba835e0e624f8ad3d2bbad14a552b0e Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 12:39:55 +0800 Subject: [PATCH 106/222] =?UTF-8?q?649.Dota2=E5=8F=82=E8=AE=AE=E9=99=A2=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9EJavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0649.Dota2参议院.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0649.Dota2参议院.md b/problems/0649.Dota2参议院.md index e2900824..cda5dd95 100644 --- a/problems/0649.Dota2参议院.md +++ b/problems/0649.Dota2参议院.md @@ -219,6 +219,31 @@ func predictPartyVictory(senateStr string) string { ## JavaScript ```js +var predictPartyVictory = function(senateStr) { + // R = true表示本轮循环结束后,字符串里依然有R;D同理。 + let R = true, D = true; + // 当flag大于0时,R在D前出现,R可以消灭D。当flag小于0时,D在R前出现,D可以消灭R + let flag = 0; + let senate = senateStr.split(''); + while(R && D){ // 一旦R或者D为false,就结束循环,说明本轮结束后只剩下R或者D了 + R = false; + D = false; + for(let i = 0; i < senate.length; i++){ + if(senate[i] === 'R'){ + if(flag < 0) senate[i] = 0;// 消灭R,R此时为false + else R = true;// 如果没被消灭,本轮循环结束有R + flag++; + } + if(senate[i] === 'D'){ + if(flag > 0) senate[i] = 0; + else D = true; + flag--; + } + } + } + // 循环结束之后,R和D只能有一个为true + return R ? "Radiant" : "Dire"; +}; ``` ----------------------- From 55e185b5e651860f0363cea4a5fdfdbe72ba1310 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 13:06:39 +0800 Subject: [PATCH 107/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=201207.=E7=8B=AC?= =?UTF-8?q?=E4=B8=80=E6=97=A0=E4=BA=8C=E7=9A=84=E5=87=BA=E7=8E=B0=E6=AC=A1?= =?UTF-8?q?=E6=95=B0=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1207.独一无二的出现次数.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/problems/1207.独一无二的出现次数.md b/problems/1207.独一无二的出现次数.md index 027c9f5a..f18af16c 100644 --- a/problems/1207.独一无二的出现次数.md +++ b/problems/1207.独一无二的出现次数.md @@ -118,7 +118,23 @@ class Solution: Go: JavaScript: - +``` javascript +var uniqueOccurrences = function(arr) { + const count = new Array(2002).fill(0);// -1000 <= arr[i] <= 1000 + for(let i = 0; i < arr.length; i++){ + count[arr[i] + 1000]++;// 防止负数作为下标 + } + // 标记相同频率是否重复出现 + const fre = new Array(1002).fill(false);// 1 <= arr.length <= 1000 + for(let i = 0; i <= 2000; i++){ + if(count[i] > 0){//有i出现过 + if(fre[count[i]] === false) fre[count[i]] = true;//之前未出现过,标记为出现 + else return false;//之前就出现了,重复出现 + } + } + return true; +}; +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From 24c515282ada19201d460a7e27ddc4979c3eb7ee Mon Sep 17 00:00:00 2001 From: yqq Date: Mon, 27 Sep 2021 16:08:33 +0800 Subject: [PATCH 108/222] =?UTF-8?q?1002.=20=E6=9F=A5=E6=89=BE=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E7=AC=A6,=20=20=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=A2=98=E7=9B=AE=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1002.查找常用字符.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/problems/1002.查找常用字符.md b/problems/1002.查找常用字符.md index e02780da..043d20a4 100644 --- a/problems/1002.查找常用字符.md +++ b/problems/1002.查找常用字符.md @@ -12,18 +12,24 @@ [力扣题目链接](https://leetcode-cn.com/problems/find-common-characters/) -给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。 +给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。 -你可以按任意顺序返回答案。 +示例 1: -【示例一】 -输入:["bella","label","roller"] +输入:words = ["bella","label","roller"] 输出:["e","l","l"] +示例 2: -【示例二】 -输入:["cool","lock","cook"] +输入:words = ["cool","lock","cook"] 输出:["c","o"] +提示: + +1 <= words.length <= 100 +1 <= words[i].length <= 100 +words[i] 由小写英文字母组成 + + # 思路 From ff3f31aed05dd05c5740b63415f494b198c8a477 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 16:14:35 +0800 Subject: [PATCH 109/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20283.=20=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E9=9B=B6=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0283.移动零.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/problems/0283.移动零.md b/problems/0283.移动零.md index 3909bcd5..2498bdc3 100644 --- a/problems/0283.移动零.md +++ b/problems/0283.移动零.md @@ -95,6 +95,21 @@ Python: Go: JavaScript: +```javascript +var moveZeroes = function(nums) { + let slow = 0; + for(let fast = 0; fast < nums.length; fast++){ + if(nums[fast] != 0){//找到非0的元素 + nums[slow] = nums[fast];//把非0的元素赋值给数组慢指针指向的索引处的值 + slow++;//慢指针向右移动 + } + } + // 后面的元素全变成 0 + for(let j = slow; j < nums.length; j++){ + nums[j] = 0; + } +}; +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From a1e32680ac4e314969dbf7578caac5b7e80b3aa2 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 16:40:41 +0800 Subject: [PATCH 110/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20463.=E5=B2=9B?= =?UTF-8?q?=E5=B1=BF=E7=9A=84=E5=91=A8=E9=95=BF=20JavaScript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0463.岛屿的周长.md | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/problems/0463.岛屿的周长.md b/problems/0463.岛屿的周长.md index fd9585d2..e6077456 100644 --- a/problems/0463.岛屿的周长.md +++ b/problems/0463.岛屿的周长.md @@ -120,6 +120,55 @@ Python: Go: JavaScript: +```javascript +//解法一 +var islandPerimeter = function(grid) { + // 上下左右 4 个方向 + const dirx = [-1, 1, 0, 0], diry = [0, 0, -1, 1]; + const m = grid.length, n = grid[0].length; + let res = 0; //岛屿周长 + for(let i = 0; i < m; i++){ + for(let j = 0; j < n; j++){ + if(grid[i][j] === 1){ + for(let k = 0; k < 4; k++){ //上下左右四个方向 + // 计算周边坐标的x,y + let x = i + dirx[k]; + let y = j + diry[k]; + // 四个方向扩展的新位置是水域或者越界就会为周长贡献1 + if(x < 0 // i在边界上 + || x >= m // i在边界上 + || y < 0 // j在边界上 + || y >= n // j在边界上 + || grid[x][y] === 0){ // (x,y)位置是水域 + res++; + continue; + } + } + } + } + } + return res; +}; + +//解法二 +var islandPerimeter = function(grid) { + let sum = 0; // 陆地数量 + let cover = 0; // 相邻数量 + for(let i = 0; i < grid.length; i++){ + for(let j = 0; j = 0 && grid[i-1][j] === 1) cover++; + // 统计左边相邻陆地 + if(j - 1 >= 0 && grid[i][j-1] === 1) cover++; + // 为什么没统计下边和右边? 因为避免重复计算 + } + } + } + return sum * 4 - cover * 2; +}; +``` ----------------------- From 195b8aefddc4266487c2c0894344134d4594bdb0 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 17:23:26 +0800 Subject: [PATCH 111/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E1221.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=B9=B3=E8=A1=A1=E5=AD=97=E7=AC=A6=E4=B8=B2=20JavaSc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1221.分割平衡字符串.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/problems/1221.分割平衡字符串.md b/problems/1221.分割平衡字符串.md index c764e3ff..381ad060 100644 --- a/problems/1221.分割平衡字符串.md +++ b/problems/1221.分割平衡字符串.md @@ -108,6 +108,15 @@ public: ## JavaScript ```js +var balancedStringSplit = function(s) { + let res = 0, total = 0;//res为平衡字符串数量 total为当前"R"字符和"L"字符的数量差 + for(let c of s){// 遍历字符串每个字符 + //因为开始字符数量差就是0,遍历的时候要先改变数量差,否则会影响结果数量 + total += c === 'R' ? 1:-1;//遇到"R",total++;遇到"L",total-- + if(total === 0) res++;//只要"R""L"数量一样就可以算是一个平衡字符串 + } + return res; +}; ``` ----------------------- From 571ce5788e816d59fe6266e95a5eeeba36e965df Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 17:44:58 +0800 Subject: [PATCH 112/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A01356.=20=E5=A6=82?= =?UTF-8?q?=E4=BD=95=E8=AE=A1=E7=AE=97=E4=BA=8C=E8=BF=9B=E5=88=B6=E4=B8=AD?= =?UTF-8?q?1=E7=9A=84=E6=95=B0=E9=87=8F=20JavaScript=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1356.根据数字二进制下1的数目排序.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/problems/1356.根据数字二进制下1的数目排序.md b/problems/1356.根据数字二进制下1的数目排序.md index 06c29500..c7e856d1 100644 --- a/problems/1356.根据数字二进制下1的数目排序.md +++ b/problems/1356.根据数字二进制下1的数目排序.md @@ -166,6 +166,18 @@ class Solution { ## JavaScript ```js +var sortByBits = function(arr) { + const bitCount = n =>{// 计算n的二进制中1的数量 + let count = 0; + while(n){ + n &= (n - 1);// 清除最低位的1 + count++; + } + return count; + } + // 如果有差,则按bits数排,如果无差,则按原值排 + return arr.sort((a,b) => bitCount(a) - bitCount(b) || a - b); +}; ``` ----------------------- From 16dcd4cd839c17d4417801c6ee1dc59c84aa4c29 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 17:54:30 +0800 Subject: [PATCH 113/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A01365.=20=E6=9C=89?= =?UTF-8?q?=E5=A4=9A=E5=B0=91=E5=B0=8F=E4=BA=8E=E5=BD=93=E5=89=8D=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E7=9A=84=E6=95=B0=E5=AD=97=20JavaScript=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...365.有多少小于当前数字的数字.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/problems/1365.有多少小于当前数字的数字.md b/problems/1365.有多少小于当前数字的数字.md index 5cf6b2d8..cd003f2f 100644 --- a/problems/1365.有多少小于当前数字的数字.md +++ b/problems/1365.有多少小于当前数字的数字.md @@ -155,7 +155,23 @@ class Solution: Go: JavaScript: - +```javascript +var smallerNumbersThanCurrent = function(nums) { + const map = new Map();// 记录数字 nums[i] 有多少个比它小的数字 + const res = nums.slice(0);//深拷贝nums + res.sort((a,b) => a - b); + for(let i = 0; i < res.length; i++){ + if(!map.has(res[i])){// 遇到了相同的数字,那么不需要更新该 number 的情况 + map.set(res[i],i); + } + } + // 此时map里保存的每一个元素数值 对应的 小于这个数值的个数 + for(let i = 0; i < nums.length; i++){ + res[i] = map.get(nums[i]); + } + return res; +}; +``` ----------------------- From a5a088b35fe494205d61479a267205df4692f7cd Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 18:14:07 +0800 Subject: [PATCH 114/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A01382.=20=E5=B0=86?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E5=8F=98=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1382.将二叉搜索树变平衡.md | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/problems/1382.将二叉搜索树变平衡.md b/problems/1382.将二叉搜索树变平衡.md index bce58c33..8e1cbe37 100644 --- a/problems/1382.将二叉搜索树变平衡.md +++ b/problems/1382.将二叉搜索树变平衡.md @@ -126,6 +126,29 @@ class Solution: Go: JavaScript: +```javascript +var balanceBST = function(root) { + const res = []; + // 中序遍历转成有序数组 + const travesal = cur => { + if(!cur) return; + travesal(cur.left); + res.push(cur.val); + travesal(cur.right); + } + // 有序数组转成平衡二叉树 + const getTree = (nums, left, right) => { + if(left > right) return null; + let mid = left + ((right - left) >> 1); + let root = new TreeNode(nums[mid]);// 中心位置作为当前节点的值 + root.left = getTree(nums, left, mid - 1);// 递归地将区间[left,mid−1] 作为当前节点的左子树 + root.right = getTree(nums, mid + 1, right);// 递归地将区间[mid+1,right] 作为当前节点的左子树 + return root; + } + travesal(root); + return getTree(res, 0, res.length - 1); +}; +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 03582efc4a2e8532d48e70e9bbfad78de430ed65 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 18:23:48 +0800 Subject: [PATCH 115/222] =?UTF-8?q?Update=200941.=E6=9C=89=E6=95=88?= =?UTF-8?q?=E7=9A=84=E5=B1=B1=E8=84=89=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0941.有效的山脉数组.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/problems/0941.有效的山脉数组.md b/problems/0941.有效的山脉数组.md index c4c8ebfa..2073ba59 100644 --- a/problems/0941.有效的山脉数组.md +++ b/problems/0941.有效的山脉数组.md @@ -154,6 +154,16 @@ func validMountainArray(arr []int) bool { ## JavaScript ```js +var validMountainArray = function(arr) { + if(arr.length < 3) return false;// 一定不是山脉数组 + let left = 0, right = arr.length - 1;// 双指针 + // 注意防止越界 + while(left < arr.length && arr[left] < arr[left+1]) left++; + while(right>0 && arr[right-1] > arr[right]) right--; + // 如果left或者right都在起始位置,说明不是山峰 + if(left === right && left !== 0 && right !== arr.length - 1) return true; + return false; +}; ``` ----------------------- From db571bd895e46dce7fb7b4d707dd71719e795060 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 18:35:36 +0800 Subject: [PATCH 116/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0925.=E9=95=BF?= =?UTF-8?q?=E9=94=AE=E6=8C=89=E5=85=A5=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0925.长按键入.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/problems/0925.长按键入.md b/problems/0925.长按键入.md index 70597508..02dca305 100644 --- a/problems/0925.长按键入.md +++ b/problems/0925.长按键入.md @@ -182,6 +182,34 @@ func isLongPressedName(name string, typed string) bool { ``` JavaScript: +```javascript +var isLongPressedName = function(name, typed) { + let i = 0, j = 0; + const m = name.length, n = typed.length; + while(i < m && j < n){ + if(name[i] === typed[j]){ // 相同则同时向后匹配 + i++; j++; + } else { + if(j === 0) return false; // 如果是第一位就不相同直接返回false + // 判断边界为n-1,若为n会越界,例如name:"kikcxmvzi" typed:"kiikcxxmmvvzzz" + while(j < n - 1 && typed[j] === typed[j-1]) j++; + if(name[i] === typed[j]){ // j跨越重复项之后再次和name[i]匹配,相同则同时向后匹配 + i++; j++; + } else { + return false; + } + } + } + // 说明name没有匹配完 例如 name:"pyplrzzzzdsfa" type:"ppyypllr" + if(i < m) return false; + // 说明type没有匹配完 例如 name:"alex" type:"alexxrrrrssda" + while(j < n) { + if(typed[j] === typed[j-1]) j++; + else return false; + } + return true; +}; +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From a35adcffbee7ff9c229cff38eff9506b396c0186 Mon Sep 17 00:00:00 2001 From: yqq Date: Mon, 27 Sep 2021 18:51:54 +0800 Subject: [PATCH 117/222] =?UTF-8?q?1035.=E4=B8=8D=E7=9B=B8=E4=BA=A4?= =?UTF-8?q?=E7=9A=84=E7=BA=BF.md,=20=E5=A2=9E=E5=8A=A0Golang=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1035.不相交的线.md | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/problems/1035.不相交的线.md b/problems/1035.不相交的线.md index a10fd381..8795a77d 100644 --- a/problems/1035.不相交的线.md +++ b/problems/1035.不相交的线.md @@ -109,6 +109,41 @@ class Solution: return dp[-1][-1] ``` + +Golang: + +```go + +func maxUncrossedLines(A []int, B []int) int { + m, n := len(A), len(B) + dp := make([][]int, m+1) + for i := range dp { + dp[i] = make([]int, n+1) + } + + for i := 1; i <= len(A); i++ { + for j := 1; j <= len(B); j++ { + if (A[i - 1] == B[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); + } + } + } + return dp[m][n]; + +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` + + + JavaScript: ```javascript From a3b5912c1aee1096e7e7cf2c2d9dfd1df0d6a5cc Mon Sep 17 00:00:00 2001 From: yqq Date: Mon, 27 Sep 2021 18:52:44 +0800 Subject: [PATCH 118/222] fix --- problems/1035.不相交的线.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/1035.不相交的线.md b/problems/1035.不相交的线.md index 8795a77d..22cf613b 100644 --- a/problems/1035.不相交的线.md +++ b/problems/1035.不相交的线.md @@ -124,13 +124,13 @@ func maxUncrossedLines(A []int, B []int) int { for i := 1; i <= len(A); i++ { for j := 1; j <= len(B); j++ { if (A[i - 1] == B[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] + 1; + dp[i][j] = dp[i - 1][j - 1] + 1 } else { - dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); + dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) } } } - return dp[m][n]; + return dp[m][n] } From 224dc5f5612fb916bb6e97fd1026d2bc2c49bd30 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 18:54:45 +0800 Subject: [PATCH 119/222] =?UTF-8?q?Update=200922.=E6=8C=89=E5=A5=87?= =?UTF-8?q?=E5=81=B6=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0922.按奇偶排序数组II.md | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/problems/0922.按奇偶排序数组II.md b/problems/0922.按奇偶排序数组II.md index 5b66247e..05cff32a 100644 --- a/problems/0922.按奇偶排序数组II.md +++ b/problems/0922.按奇偶排序数组II.md @@ -209,6 +209,57 @@ func sortArrayByParityII(nums []int) []int { ## JavaScript ```js +//方法一 +var sortArrayByParityII = function(nums) { + const n = nums.length; + // 分别存放 nums 中的奇数、偶数 + let evenIndex = 0, oddIndex = 0; + // 初始化就确定数组大小,节省开销 + const even = new Array(Math.floor(n/2)); + const odd = new Array(Math.floor(n/2)); + // 把A数组放进偶数数组,和奇数数组 + for(let i = 0; i < n; i++){ + if(nums[i] % 2 === 0) even[evenIndex++] = nums[i]; + else odd[oddIndex++] = nums[i]; + } + // 把奇偶数组重新存回 nums + let index = 0; + for(let i = 0; i < even.length; i++){ + nums[index++] = even[i]; + nums[index++] = odd[i]; + } + return nums; +}; + +//方法二 +var sortArrayByParityII = function(nums) { + const n = nums.length; + const result = new Array(n); + // 偶数下标 和 奇数下标 + let evenIndex = 0, oddIndex = 1; + for(let i = 0; i < n; i++){ + if(nums[i] % 2 === 0) { + result[evenIndex] = nums[i]; + evenIndex += 2; + } else { + result[oddIndex] = nums[i]; + oddIndex += 2; + } + } + return result; +}; + +//方法三 +var sortArrayByParityII = function(nums) { + let oddIndex = 1; + for(let i = 0; i < nums.length; i += 2){ + if(nums[i] % 2 === 1){ // 在偶数位遇到了奇数 + while(nums[oddIndex] % 2 !== 0) oddIndex += 2;// 在奇数位找一个偶数 + [nums[oddIndex], nums[i]] = [nums[i], nums[oddIndex]]; // 解构赋值交换 + } + } + return nums; +}; ``` ----------------------- From 8edca00e487878a00b16a296b35ff9a14fb3cb2f Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 20:37:23 +0800 Subject: [PATCH 120/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E724.=20=E5=AF=BB?= =?UTF-8?q?=E6=89=BE=E6=95=B0=E7=BB=84=E7=9A=84=E4=B8=AD=E5=BF=83=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0724.寻找数组的中心索引.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/problems/0724.寻找数组的中心索引.md b/problems/0724.寻找数组的中心索引.md index 991ce647..d5fa48ee 100644 --- a/problems/0724.寻找数组的中心索引.md +++ b/problems/0724.寻找数组的中心索引.md @@ -129,6 +129,17 @@ func pivotIndex(nums []int) int { ## JavaScript ```js +var pivotIndex = function(nums) { + const sum = nums.reduce((a,b) => a + b);//求和 + // 中心索引左半和 中心索引右半和 + let leftSum = 0, rightSum = 0; + for(let i = 0; i < nums.length; i++){ + leftSum += nums[i]; + rightSum = sum - leftSum + nums[i];// leftSum 里面已经有 nums[i],多减了一次,所以加上 + if(leftSum === rightSum) return i; + } + return -1; +}; ``` ----------------------- From 5a10b329da87245d11a46564af8e4cb00c122113 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 20:48:55 +0800 Subject: [PATCH 121/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0673.=20=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E9=80=92=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97=E7=9A=84?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0673.最长递增子序列的个数.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/problems/0673.最长递增子序列的个数.md b/problems/0673.最长递增子序列的个数.md index 653edadf..bf0a2a5a 100644 --- a/problems/0673.最长递增子序列的个数.md +++ b/problems/0673.最长递增子序列的个数.md @@ -337,6 +337,28 @@ func findNumberOfLIS(nums []int) int { ## JavaScript ```js +var findNumberOfLIS = function(nums) { + const len = nums.length; + if(len <= 1) return len; + let dp = new Array(len).fill(1); // i之前(包括i)最长递增子序列的长度为dp[i] + let count = new Array(len).fill(1); // 以nums[i]为结尾的字符串,最长递增子序列的个数为count[i] + let res = 0; + for(let i = 1; i < len; i++){ + for(let j = 0; j < i; j++){ + if(nums[i] > nums[j]){ + if(dp[j] + 1 > dp[i]){ // 第 j 个数字为前一个数字的子序列是否更更长 + dp[i] = dp[j] + 1; //更新 dp[i] + count[i] = count[j]; // 重置count[i] + } else if(dp[j] + 1 === dp[i]){ // 和原来一样长 + count[i] += count[j]; //更新count[i] + } + } + } + } + let max = Math.max(...dp); //扩展运算符找到最大长度 + for(let i = 0; i < len; i++) if(dp[i] === max) res += count[i]; // 累加 + return res; +}; ``` ----------------------- From 93f29ed6d5cce50ccaf057a8a3177318c105b344 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 20:55:52 +0800 Subject: [PATCH 122/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20205.=20=E5=90=8C?= =?UTF-8?q?=E6=9E=84=E5=AD=97=E7=AC=A6=E4=B8=B2=20JavaScript=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0205.同构字符串.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/problems/0205.同构字符串.md b/problems/0205.同构字符串.md index 5d20aa4a..1b4d0e32 100644 --- a/problems/0205.同构字符串.md +++ b/problems/0205.同构字符串.md @@ -119,6 +119,25 @@ func isIsomorphic(s string, t string) bool { ## JavaScript ```js +var isIsomorphic = function(s, t) { + let len = s.length; + if(len === 0) return true; + let maps = new Map(); + let mapt = new Map(); + for(let i = 0, j = 0; i < len; i++, j++){ + if(!maps.has(s[i])){ + maps.set(s[i],t[j]);// maps保存 s[i] 到 t[j]的映射 + } + if(!mapt.has(t[i])){ + mapt.set(t[j],s[i]);// mapt保存 t[j] 到 s[i]的映射 + } + // 无法映射,返回 false + if(maps.get(s[i]) !== t[j] || mapt.get(t[j]) !== s[i]){ + return false; + } + }; + return true; +}; ``` ----------------------- From 6158db21aac6409775a20ffb117ab4c8a39801e7 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 20:57:26 +0800 Subject: [PATCH 123/222] =?UTF-8?q?js=E7=89=88=E6=9C=AC=E7=AC=94=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E7=A8=8D=E4=BD=9C=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0205.同构字符串.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0205.同构字符串.md b/problems/0205.同构字符串.md index 1b4d0e32..478b5290 100644 --- a/problems/0205.同构字符串.md +++ b/problems/0205.同构字符串.md @@ -128,7 +128,7 @@ var isIsomorphic = function(s, t) { if(!maps.has(s[i])){ maps.set(s[i],t[j]);// maps保存 s[i] 到 t[j]的映射 } - if(!mapt.has(t[i])){ + if(!mapt.has(t[j])){ mapt.set(t[j],s[i]);// mapt保存 t[j] 到 s[i]的映射 } // 无法映射,返回 false From 65901bdee41eb6071ca6c03209b114bcf562ffd4 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:07:45 +0800 Subject: [PATCH 124/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20234.=20=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E9=93=BE=E8=A1=A8=20JavaScript=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0234.回文链表.md | 36 ++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/problems/0234.回文链表.md b/problems/0234.回文链表.md index 631d2f6b..c93e534e 100644 --- a/problems/0234.回文链表.md +++ b/problems/0234.回文链表.md @@ -284,7 +284,41 @@ class Solution: ## JavaScript ```js - +var isPalindrome = function(head) { + const reverseList = head => {// 反转链表 + let temp = null; + let pre = null; + while(head != null){ + temp = head.next; + head.next = pre; + pre = head; + head = temp; + } + return pre; + } + // 如果为空或者仅有一个节点,返回true + if(!head && !head.next) return true; + let slow = head; + let fast = head; + let pre = head; + while(fast != null && fast.next != null){ + pre = slow; // 记录slow的前一个结点 + slow = slow.next; + fast = fast.next.next; + } + pre.next = null; // 分割两个链表 + // 前半部分 + let cur1 = head; + // 后半部分。这里使用了反转链表 + let cur2 = reverseList(slow); + while(cur1 != null){ + if(cur1.val != cur2.val) return false; + // 注意要移动两个结点 + cur1 = cur1.next; + cur2 = cur2.next; + } + return true; +}; ``` From 227bed3396b3695119d5f1169fb15e4840ce50cb Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:12:33 +0800 Subject: [PATCH 125/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20141.=20=E7=8E=AF?= =?UTF-8?q?=E5=BD=A2=E9=93=BE=E8=A1=A8=20JavaScript=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0141.环形链表.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/problems/0141.环形链表.md b/problems/0141.环形链表.md index 34b8d25f..14c21b67 100644 --- a/problems/0141.环形链表.md +++ b/problems/0141.环形链表.md @@ -114,6 +114,17 @@ class Solution: ## JavaScript ```js +var hasCycle = function(head) { + let fast = head; + let slow = head; + // 空链表、单节点链表一定不会有环 + while(fast != null && fast.next != null){ + fast = fast.next.next; // 快指针,一次移动两步 + slow = slow.next; // 慢指针,一次移动一步 + if(fast === slow) return true; // 快慢指针相遇,表明有环 + } + return false; // 正常走到链表末尾,表明没有环 +}; ``` ----------------------- From 66b3cac2c7e62e4ee5c4aae316611b39fac740b2 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:23:55 +0800 Subject: [PATCH 126/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E70.=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85=E7=89=88=E6=9C=AC?= =?UTF-8?q?=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0070.爬楼梯完全背包版本.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/problems/0070.爬楼梯完全背包版本.md b/problems/0070.爬楼梯完全背包版本.md index 4410dbaf..097ecfdb 100644 --- a/problems/0070.爬楼梯完全背包版本.md +++ b/problems/0070.爬楼梯完全背包版本.md @@ -186,6 +186,20 @@ func climbStairs(n int) int { } ``` +JavaScript: +```javascript +var climbStairs = function(n) { + const dp = new Array(n+1).fill(0); + const weight = [1,2]; + dp[0] = 1; + for(let i = 0; i <= n; i++){ //先遍历背包 + for(let j = 0; j < weight.length; j++){ // 再遍历物品 + if(i >= weight[j]) dp[i] += dp[i-weight[j]]; + } + } + return dp[n]; +}; +``` ----------------------- From f34b2472643b6ebc98b16856b90f25835294c0c1 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:34:56 +0800 Subject: [PATCH 127/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E34.=E6=9C=B4=E5=AE=9E?= =?UTF-8?q?=E6=97=A0=E5=8D=8E=E7=9A=84=E4=BA=8C=E5=88=86=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...元素的第一个和最后一个位置.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md index 68dd797d..33694577 100644 --- a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md +++ b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md @@ -396,6 +396,46 @@ class Solution: ## JavaScript ```js +var searchRange = function(nums, target) { + const getLeftBorder = (nums, target) => { + let left = 0, right = nums.length - 1; + let leftBorder = -2;// 记录一下leftBorder没有被赋值的情况 + while(left <= right){ + let middle = left + ((right - left) >> 1); + if(nums[middle] >= target){ // 寻找左边界,nums[middle] == target的时候更新right + right = middle - 1; + leftBorder = right; + } else { + left = middle + 1; + } + } + return leftBorder; + } + + const getRightBorder = (nums, target) => { + let left = 0, right = nums.length - 1; + let rightBorder = -2; // 记录一下rightBorder没有被赋值的情况 + while (left <= right) { + let middle = left + ((right - left) >> 1); + if (nums[middle] > target) { + right = middle - 1; + } else { // 寻找右边界,nums[middle] == target的时候更新left + left = middle + 1; + rightBorder = left; + } + } + return rightBorder; + } + + let leftBorder = getLeftBorder(nums, target); + let rightBorder = getRightBorder(nums, target); + // 情况一 + if(leftBorder === -2 || rightBorder === -2) return [-1,-1]; + // 情况三 + if (rightBorder - leftBorder > 1) return [leftBorder + 1, rightBorder - 1]; + // 情况二 + return [-1, -1]; +}; ``` ----------------------- From 33c2715b85f48365a7eff33ad488af98c23f169c Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 22:03:18 +0800 Subject: [PATCH 128/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=2031.=20=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=8E=92=E5=88=97=20JavaScript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0031.下一个排列.md | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/problems/0031.下一个排列.md b/problems/0031.下一个排列.md index 05321a9a..46568fae 100644 --- a/problems/0031.下一个排列.md +++ b/problems/0031.下一个排列.md @@ -132,6 +132,52 @@ class Solution { ## JavaScript ```js +//卡尔的解法(吐槽一下JavaScript的sort和其他语言的不太一样,只想到了拷贝数组去排序再替换原数组来实现nums的[i + 1, nums.length)升序排序) +var nextPermutation = function(nums) { + for(let i = nums.length - 1; i >= 0; i--){ + for(let j = nums.length - 1; j > i; j--){ + if(nums[j] > nums[i]){ + [nums[j],nums[i]] = [nums[i],nums[j]]; // 交换 + // 深拷贝[i + 1, nums.length)部分到新数组arr + let arr = nums.slice(i+1); + // arr升序排序 + arr.sort((a,b) => a - b); + // arr替换nums的[i + 1, nums.length)部分 + nums.splice(i+1,nums.length - i, ...arr); + return; + } + } + } + nums.sort((a,b) => a - b); // 不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 +}; + +//另一种 +var nextPermutation = function(nums) { + let i = nums.length - 2; + // 从右往左遍历拿到第一个左边小于右边的 i,此时 i 右边的数组是从右往左递增的 + while (i >= 0 && nums[i] >= nums[i+1]){ + i--; + } + if (i >= 0){ + let j = nums.length - 1; + // 从右往左遍历拿到第一个大于nums[i]的数,因为之前nums[i]是第一个小于他右边的数,所以他的右边一定有大于他的数 + while (j >= 0 && nums[j] <= nums[i]){ + j--; + } + // 交换两个数 + [nums[j], nums[i]] = [nums[i], nums[j]]; + } + // 对 i 右边的数进行交换 + // 因为 i 右边的数原来是从右往左递增的,把一个较小的值交换过来之后,仍然维持单调递增特性 + // 此时头尾交换并向中间逼近就能获得 i 右边序列的最小值 + let l = i + 1; + let r = nums.length - 1; + while (l < r){ + [nums[l], nums[r]] = [nums[r], nums[l]]; + l++; + r--; + } +}; ``` ----------------------- From 3ddd1a277b3c18cce0f2b687551da406f9a2a1ce Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 22:53:43 +0800 Subject: [PATCH 129/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A05.=20=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2=20JavaScript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0005.最长回文子串.md | 111 ++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md index c78b827c..5897495f 100644 --- a/problems/0005.最长回文子串.md +++ b/problems/0005.最长回文子串.md @@ -297,6 +297,117 @@ class Solution: ## JavaScript ```js +//动态规划解法 +var longestPalindrome = function(s) { + const len = s.length; + // 布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false + let dp = new Array(len).fill(false).map(() => new Array(len).fill(false)); + // left起始位置 maxlenth回文串长度 + let left = 0, maxlenth = 0; + for(let i = len - 1; i >= 0; i--){ + for(let j = i; j < len; j++){ + // 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 j - i == 0 + // 情况二:下标i 与 j相差为1,例如aa,也是文子串 j - i == 1 + // 情况一和情况二 可以合并为 j - i <= 1 + // 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]===true + if(s[i] === s[j] && (j - i <= 1 || dp[i + 1][j - 1])){ + dp[i][j] = true; + } + // 只要 dp[i][j] == true 成立,就表示子串 s[i..j] 是回文,此时记录回文长度和起始位置 + if(dp[i][j] && j - i + 1 > maxlenth) { + maxlenth = j - i + 1; // 回文串长度 + left = i; // 起始位置 + } + } + } + return s.substr(left, maxlenth); // 找到子串 +}; + +//双指针 +var longestPalindrome = function(s) { + let left = 0, right = 0, maxLength = 0; + const extend = (s, i, j, n) => {// s为字符串 i,j为双指针 n为字符串长度 + while(i >= 0 && j < n && s[i] === s[j]){ + if(j - i + 1 > maxLength){ + left = i; // 更新开始位置 + right = j; // 更新结尾位置 + maxLength = j - i + 1; // 更新子串最大长度 + } + // 指针移动 + i--; + j++; + } + } + for(let i = 0; i < s.length; i++){ + extend(s, i, i, s.length); // 以i为中心 + extend(s, i, i + 1, s.length); // 以i和i+1为中心 + } + return s.substr(left, maxLength); +}; + +//Manacher算法 +var longestPalindrome = function(s) { + const len = s.length; + if(len < 2) return s; + let maxLength = 1, index = 0; + //Manacher算法,利用回文对称的性质,根据i在上一个回文中心的臂长里的位置去判断i的回文性 + //需要知道上一个回文中心,以及其臂长 + let center = 0; + //注意这里使用了maxRight的而不是真实的臂长length,因为之后需要判断i在臂长的什么位置 + //如果这里臂长用了length,之后还要 计算i - center 去和 length比较,太繁琐 + let maxRight = 0; + //考虑到回文串的长度是偶数的情况,所以这里预处理一下字符串,每个字符间插入特殊字符,把可能性都化为奇数 + //这个处理把回文串长度的可能性都化为了奇数 + //#c#b#b#a# + //#c#b#a#b#d# + let ss = ""; + for(let i = 0; i < s.length; i++){ + ss += "#"+s[i]; + } + ss += "#"; + //需要维护一个每个位置臂长的信息数组positionLength + const pl = new Array(ss.length).fill(0); + //这里需要注意参考的是i关于center对称的点i'的回文性 + //i' = 2*center - i; + //所以列下情况: + //1.i>maxRight,找不到i',无法参考,自己算自己的 + //2.i<=maxRight: + //2.1 i= pl[i‘],大多少需要尝试扩散 + //2.3 i>maxRight-pl[i'],pl[i']的臂长超过了center的臂长,根据对称性,i中心扩散到MaxRight处, + // s[2*i-maxRight] !== s[MaxRight]必不相等,所以pl[i] = maxRight-i; + //总结就是pl[i] = Math.min(maxRight-i,pl[i']);提示i= 0 && right maxRight){ + center = i; + maxRight = pl[i] + i; + } + if (pl[i] * 2 + 1 > maxLength){ + maxLength = pl[i]*2+1; + index = i - pl[i]; + } + } + return ss.substr(index, maxLength).replace(/#/g,""); +}; ``` ----------------------- From a97988ede289ab6b93c029d14134267027b18651 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 23:07:36 +0800 Subject: [PATCH 130/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0844.=20=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E5=90=AB=E9=80=80=E6=A0=BC=E7=9A=84=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0844.比较含退格的字符串.md | 58 ++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md index 74455ace..a3199ebe 100644 --- a/problems/0844.比较含退格的字符串.md +++ b/problems/0844.比较含退格的字符串.md @@ -232,6 +232,64 @@ func backspaceCompare(s string, t string) bool { ``` JavaScript: +```javascript +// 双栈 +var backspaceCompare = function(s, t) { + const arrS = [], arrT = []; // 数组作为栈使用 + for(let char of s){ + char === '#' ? arrS.pop() : arrS.push(char); + } + for(let char of t){ + char === '#' ? arrT.pop() : arrT.push(char); + } + return arrS.join('') === arrT.join(''); // 比较两个字符串是否相等 +}; + +//双栈精简 +var backspaceCompare = function(s, t) { + const getString = s => { + let arrS = []; + for(let char of s){ + char === '#' ? arrS.pop() : arrS.push(char); + } + return arrS.join(''); + } + return getString(s) === getString(t); +}; + +//双指针 +var backspaceCompare = function(s, t) { + let sSkipNum = 0; // 记录s的#数量 + let tSkipNum = 0; // 记录t的#数量 + let i = s.length - 1, j = t.length - 1; + while(true) { + while(i >= 0){ // 从后向前,消除s的# + if(s[i] === '#') sSkipNum++; + else { + if (sSkipNum > 0) sSkipNum--; + else break; + } + i--; + } + while (j >= 0) { // 从后向前,消除t的# + if (t[j] === '#') tSkipNum++; + else { + if (tSkipNum > 0) tSkipNum--; + else break; + } + j--; + } + // 后半部分#消除完了,接下来比较s[i] != t[j] + if (i < 0 || j < 0) break; // s 或者t 遍历到头了 + if (s[i] !== t[j]) return false; + i--;j--; + } + // 说明s和t同时遍历完毕 + if (i == -1 && j == -1) return true; + return false; +}; + +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 4d4cd5baceadfa6dea2515a80f55a1434e13d86f Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 23:26:57 +0800 Subject: [PATCH 131/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0841.=20=E9=92=A5?= =?UTF-8?q?=E5=8C=99=E5=92=8C=E6=88=BF=E9=97=B4=20JavaScript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0841.钥匙和房间.md | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md index d281dc5a..055a023c 100644 --- a/problems/0841.钥匙和房间.md +++ b/problems/0841.钥匙和房间.md @@ -220,6 +220,55 @@ func canVisitAllRooms(rooms [][]int) bool { ``` JavaScript: +```javascript +//DFS +var canVisitAllRooms = function(rooms) { + const dfs = (key, rooms, visited) => { + if(visited[key]) return; + visited[key] = 1; + for(let k of rooms[key]){ + // 深度优先搜索遍历 + dfs(k, rooms, visited); + } + } + const visited = new Array(rooms.length).fill(false); + dfs(0, rooms, visited); + //检查是否都访问到了 + for (let i of visited) { + if (!i) { + return false; + } + } + return true; +}; + +//BFS +var canVisitAllRooms = function(rooms) { + const bfs = rooms => { + const visited = new Array(rooms.length).fill(0); // 标记房间是否被访问过 + visited[0] = 1; // 0 号房间开始 + const queue = []; //js数组作为队列使用 + queue.push(0); // 0 号房间开始 + // 广度优先搜索的过程 + while(queue.length !== 0){ + let key = queue[0]; + queue.shift(); + for(let k of rooms[key]){ + if(!visited[k]){ + queue.push(k); + visited[k] = 1; + } + } + } + // 检查房间是不是都遍历过了 + for(let i of visited){ + if(i === 0) return false; + } + return true; + } + return bfs(rooms); +}; +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 6a9fa6713a0259a0ff65b9ee10a9d25bb7dc8b3d Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 23:51:56 +0800 Subject: [PATCH 132/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E132.=20=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2=20II=20JavaScript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0132.分割回文串II.md | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/problems/0132.分割回文串II.md b/problems/0132.分割回文串II.md index f9cbd618..4cf86496 100644 --- a/problems/0132.分割回文串II.md +++ b/problems/0132.分割回文串II.md @@ -247,6 +247,42 @@ class Solution: ## JavaScript ```js +var minCut = function(s) { + const len = s.length; + // 二维数组isPalindromic来保存整个字符串的回文情况 + const isPalindromic = new Array(len).fill(false).map(() => new Array(len).fill(false)); + for(let i = len - 1; i >= 0; i--){ + for(let j = i; j < len; j++){ + if(s[i] === s[j] && (j - i <= 1 || isPalindromic[i + 1][j - 1])){ + isPalindromic[i][j] = true; + } + } + } + // dp[i]:范围是[0, i]的回文子串,最少分割次数是dp[i] + const dp = new Array(len).fill(0); + for(let i = 0; i < len; i++) dp[i] = i; // 初始化 dp[i]的最大值其实就是i,也就是把每个字符分割出来 + for(let i = 1; i < len; i++){ + if(isPalindromic[0][i]){ // 判断是不是回文子串 + dp[i] = 0; + continue; + } + /* + 如果要对长度为[0, i]的子串进行分割,分割点为j。 + 那么如果分割后,区间[j + 1, i]是回文子串,那么dp[i] 就等于 dp[j] + 1。 + 这里可能有同学就不明白了,为什么只看[j + 1, i]区间,不看[0, j]区间是不是回文子串呢? + 那么在回顾一下dp[i]的定义: 范围是[0, i]的回文子串,最少分割次数是dp[i]。 + [0, j]区间的最小切割数量,我们已经知道了就是dp[j]。 + 此时就找到了递推关系,当切割点j在[0, i] 之间时候,dp[i] = dp[j] + 1; + 本题是要找到最少分割次数,所以遍历j的时候要取最小的dp[i]。dp[i] = Math.min(dp[i], dp[j] + 1); + */ + for(let j = 0; j < i; j++){ + if(isPalindromic[j + 1][i]){ + dp[i] = Math.min(dp[i], dp[j] + 1); + } + } + } + return dp[len - 1]; +}; ``` ----------------------- From 91d01d610c4c8e75b8d2789240f43a52bf8fe378 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Tue, 28 Sep 2021 00:28:04 +0800 Subject: [PATCH 133/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E42.=20=E6=8E=A5?= =?UTF-8?q?=E9=9B=A8=E6=B0=B4=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0042.接雨水.md | 99 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 16c788eb..5326dd7f 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -534,6 +534,105 @@ class Solution: Go: JavaScript: +```javascript +//双指针 +var trap = function(height) { + const len = height.length; + let sum = 0; + for(let i = 0; i < len; i++){ + // 第一个柱子和最后一个柱子不接雨水 + if(i == 0 || i == len - 1) continue; + let rHeight = height[i]; // 记录右边柱子的最高高度 + let lHeight = height[i]; // 记录左边柱子的最高高度 + for(let r = i + 1; r < len; r++){ + if(height[r] > rHeight) rHeight = height[r]; + } + for(let l = i - 1; l >= 0; l--){ + if(height[l] > lHeight) lHeight = height[l]; + } + let h = Math.min(lHeight, rHeight) - height[i]; + if(h > 0) sum += h; + } + return sum; +}; + +//动态规划 +var trap = function(height) { + const len = height.length; + if(len <= 2) return 0; + const maxLeft = new Array(len).fill(0); + const maxRight = new Array(len).fill(0); + // 记录每个柱子左边柱子最大高度 + maxLeft[0] = height[0]; + for(let i = 1; i < len; i++){ + maxLeft[i] = Math.max(height[i], maxLeft[i - 1]); + } + // 记录每个柱子右边柱子最大高度 + maxRight[len - 1] = height[len - 1]; + for(let i = len - 2; i >= 0; i--){ + maxRight[i] = Math.max(height[i], maxRight[i + 1]); + } + // 求和 + let sum = 0; + for(let i = 0; i < len; i++){ + let count = Math.min(maxLeft[i], maxRight[i]) - height[i]; + if(count > 0) sum += count; + } + return sum; +}; + +//单调栈 js数组作为栈 +var trap = function(height) { + const len = height.length; + if(len <= 2) return 0; // 可以不加 + const st = [];// 存着下标,计算的时候用下标对应的柱子高度 + st.push(0); + let sum = 0; + for(let i = 1; i < len; i++){ + if(height[i] < height[st[st.length - 1]]){ // 情况一 + st.push(i); + } + if (height[i] == height[st[st.length - 1]]) { // 情况二 + st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。 + st.push(i); + } else { // 情况三 + while (st.length !== 0 && height[i] > height[st[st.length - 1]]) { // 注意这里是while + let mid = st[st.length - 1]; + st.pop(); + if (st.length !== 0) { + let h = Math.min(height[st[st.length - 1]], height[i]) - height[mid]; + let w = i - st[st.length - 1] - 1; // 注意减一,只求中间宽度 + sum += h * w; + } + } + st.push(i); + } + } + return sum; +}; + +//单调栈 简洁版本 只处理情况三 +var trap = function(height) { + const len = height.length; + if(len <= 2) return 0; // 可以不加 + const st = [];// 存着下标,计算的时候用下标对应的柱子高度 + st.push(0); + let sum = 0; + for(let i = 1; i < len; i++){ // 只处理的情况三,其实是把情况一和情况二融合了 + while (st.length !== 0 && height[i] > height[st[st.length - 1]]) { // 注意这里是while + let mid = st[st.length - 1]; + st.pop(); + if (st.length !== 0) { + let h = Math.min(height[st[st.length - 1]], height[i]) - height[mid]; + let w = i - st[st.length - 1] - 1; // 注意减一,只求中间宽度 + sum += h * w; + } + } + st.push(i); + } + return sum; +}; +``` C: From 766af43f4e4409f953b96c27ab7ff252a5802b35 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Tue, 28 Sep 2021 00:38:48 +0800 Subject: [PATCH 134/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E129.=20=E6=B1=82?= =?UTF-8?q?=E6=A0=B9=E8=8A=82=E7=82=B9=E5=88=B0=E5=8F=B6=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E4=B9=8B=E5=92=8C=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0129.求根到叶子节点数字之和.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md index 696042a8..9a671404 100644 --- a/problems/0129.求根到叶子节点数字之和.md +++ b/problems/0129.求根到叶子节点数字之和.md @@ -241,6 +241,48 @@ class Solution: Go: JavaScript: +```javascript +var sumNumbers = function(root) { + const listToInt = path => { + let sum = 0; + for(let num of path){ + // sum * 10 表示进位 + sum = sum * 10 + num; + } + return sum; + } + const recur = root =>{ + if (root.left == null && root.right == null) { + // 当是叶子节点的时候,开始处理 + res += listToInt(path); + return; + } + + if (root.left != null){ + // 注意有回溯 + path.push(root.left.val); + recur(root.left); + path.pop(); + } + if (root.right != null){ + // 注意有回溯 + path.push(root.right.val); + recur(root.right); + path.pop(); + } + return; + }; + const path = new Array(); + let res = 0; + // 如果节点为0,那么就返回0 + if (root == null) return 0; + // 首先将根节点放到集合中 + path.push(root.val); + // 开始递归 + recur(root); + return res; +}; +``` From 46c0b8d596c0d986a2fbe1963d14f7808f15d675 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Tue, 28 Sep 2021 01:02:53 +0800 Subject: [PATCH 135/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E684.=20=E5=86=97?= =?UTF-8?q?=E4=BD=99=E8=BF=9E=E6=8E=A5=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0684.冗余连接.md | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/problems/0684.冗余连接.md b/problems/0684.冗余连接.md index bfbdeba9..654ef469 100644 --- a/problems/0684.冗余连接.md +++ b/problems/0684.冗余连接.md @@ -303,6 +303,43 @@ func findRedundantConnection(edges [][]int) []int { ## JavaScript ```js +const n = 1005; +const father = new Array(n); +// 并查集里寻根的过程 +const find = u => { + return u == father[u] ? u : father[u] = find(father[u]); +}; + +// 将v->u 这条边加入并查集 +const join = (u, v) => { + u = find(u); + v = find(v); + if(u == v) return; + father[v] = u; +}; + +// 判断 u 和 v是否找到同一个根,本题用不上 +const same = (u, v) => { + u = find(u); + v = find(v); + return u == v; +}; + +/** + * @param {number[][]} edges + * @return {number[]} + */ +var findRedundantConnection = function(edges) { + // 并查集初始化 + for(let i = 0; i < n; i++){ + father[i] = i; + } + for(let i = 0; i < edges.length; i++){ + if(same(edges[i][0], edges[i][1])) return edges[i]; + else join(edges[i][0], edges[i][1]); + } + return null; +}; ``` ----------------------- From 5c669a05a1bebe0437616bd441a4147a34abc0cb Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Tue, 28 Sep 2021 01:23:08 +0800 Subject: [PATCH 136/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E685.=20=E5=86=97?= =?UTF-8?q?=E4=BD=99=E8=BF=9E=E6=8E=A5=20II=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0685.冗余连接II.md | 85 +++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/problems/0685.冗余连接II.md b/problems/0685.冗余连接II.md index 404813f3..b7a41372 100644 --- a/problems/0685.冗余连接II.md +++ b/problems/0685.冗余连接II.md @@ -515,6 +515,91 @@ func findRedundantDirectedConnection(edges [][]int) []int { ## JavaScript ```js +const N = 1010; // 如题:二维数组大小的在3到1000范围内 +const father = new Array(N); +let n; // 边的数量 + +// 并查集里寻根的过程 +const find = u => { + return u == father[u] ? u : father[u] = find(father[u]); +}; + +// 将v->u 这条边加入并查集 +const join = (u, v) => { + u = find(u); + v = find(v); + if(u == v) return; + father[v] = u; +}; + +// 判断 u 和 v是否找到同一个根 +const same = (u, v) => { + u = find(u); + v = find(v); + return u == v; +}; + +// 在有向图里找到删除的那条边,使其变成树 +const getRemoveEdge = edges => { + // 初始化并查集 + for (let i = 1; i <= n; i++) { + father[i] = i; + } + for (let i = 0; i < n; i++) { // 遍历所有的边 + if (same(edges[i][0], edges[i][1])) { // 构成有向环了,就是要删除的边 + return edges[i]; + } + join(edges[i][0], edges[i][1]); + } + return []; +} + +// 删一条边之后判断是不是树 +const isTreeAfterRemoveEdge = (edges, deleteEdge) => { + // 初始化并查集 + for (let i = 1; i <= n; i++) { + father[i] = i; + } + for (let i = 0; i < n; i++) { + if (i == deleteEdge) continue; + if (same(edges[i][0], edges[i][1])) { // 构成有向环了,一定不是树 + return false; + } + join(edges[i][0], edges[i][1]); + } + return true; +} + +/** + * @param {number[][]} edges + * @return {number[]} + */ +var findRedundantDirectedConnection = function(edges) { + n = edges.length;// 边的数量 + const inDegree = new Array(n+1).fill(0); // 记录节点入度 + for (let i = 0; i < n; i++) { + inDegree[edges[i][1]]++; // 统计入度 + } + let vec = [];// 记录入度为2的边(如果有的话就两条边) + // 找入度为2的节点所对应的边,注意要倒叙,因为优先返回最后出现在二维数组中的答案 + for (let i = n - 1; i >= 0; i--) { + if (inDegree[edges[i][1]] == 2) { + vec.push(i); + } + } + // 处理图中情况1 和 情况2 + // 如果有入度为2的节点,那么一定是两条边里删一个,看删哪个可以构成树 + if (vec.length > 0) { + if (isTreeAfterRemoveEdge(edges, vec[0])) { + return edges[vec[0]]; + } else { + return edges[vec[1]]; + } + } + // 处理图中情况3 + // 明确没有入度为2的情况,那么一定有有向环,找到构成环的边返回就可以了 + return getRemoveEdge(edges); +}; ``` ----------------------- From 7f75ee1b562559c9ef1c4d0d38365bf3ab57195e Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Tue, 28 Sep 2021 08:44:37 +0800 Subject: [PATCH 137/222] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200704=20=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=20JavaScript=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E5=B7=A6=E9=97=AD=E5=8F=B3=E9=97=AD=E5=8C=BA=E9=97=B4=20?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0704.二分查找.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index 67809000..5b8ff8c7 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -288,15 +288,16 @@ func search(nums []int, target int) int { * @param {number} target * @return {number} */ +/** var search = function(nums, target) { - let left = 0, right = nums.length; - // 使用左闭右开区间 [left, right) - while (left < right) { + let left = 0, right = nums.length - 1; + // 使用左闭右闭区间 + while (left <= right) { let mid = left + Math.floor((right - left)/2); if (nums[mid] > target) { - right = mid; // 去左区间寻找 + right = mid - 1; // 去左面闭区间寻找 } else if (nums[mid] < target) { - left = mid + 1; // 去右区间寻找 + left = mid + 1; // 去右面闭区间寻找 } else { return mid; } From ed9ebe1c4e894575100ecdafe9bfaf5ad698814a Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Tue, 28 Sep 2021 09:05:09 +0800 Subject: [PATCH 138/222] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200077=20=E7=BB=84?= =?UTF-8?q?=E5=90=88=E4=BC=98=E5=8C=96=20c++=E4=BB=A3=E7=A0=81=20=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0077.组合优化.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/problems/0077.组合优化.md b/problems/0077.组合优化.md index 136ceb34..ff447bc1 100644 --- a/problems/0077.组合优化.md +++ b/problems/0077.组合优化.md @@ -22,7 +22,7 @@ 大家先回忆一下[77. 组合]给出的回溯法的代码: -``` +```c++ class Solution { private: vector> result; // 存放符合条件结果的集合 @@ -54,7 +54,7 @@ public: 在遍历的过程中有如下代码: -``` +```c++ for (int i = startIndex; i <= n; i++) { path.push_back(i); backtracking(n, k, i + 1); @@ -78,7 +78,7 @@ for (int i = startIndex; i <= n; i++) { **如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了**。 注意代码中i,就是for循环里选择的起始位置。 -``` +```c++ for (int i = startIndex; i <= n; i++) { ``` @@ -100,13 +100,13 @@ for (int i = startIndex; i <= n; i++) { 所以优化之后的for循环是: -``` +```c++ for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i为本次搜索的起始位置 ``` 优化后整体代码如下: -``` +```c++ class Solution { private: vector> result; From 31ac0ef5b3f270a722c79d7fbb90a278ce7bf851 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Tue, 28 Sep 2021 11:10:17 +0800 Subject: [PATCH 139/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E143.=20=E9=87=8D?= =?UTF-8?q?=E6=8E=92=E9=93=BE=E8=A1=A8=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0143.重排链表.md | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index 2b4e68b7..07c3bb40 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -351,6 +351,110 @@ class Solution: Go: JavaScript: +```javascript +// 方法一 使用数组存储节点 +var reorderList = function(head, s = [], tmp) { + let cur = head; + // list是数组,可以使用下标随机访问 + const list = []; + while(cur != null){ + list.push(cur); + cur = cur.next; + } + cur = head; // 重新回到头部 + let l = 1, r = list.length - 1; // 注意左边是从1开始 + let count = 0; + while(l <= r){ + if(count % 2 == 0){ + // even + cur.next = list[r]; + r--; + } else { + // odd + cur.next = list[l]; + l++; + } + // 每一次指针都需要移动 + cur = cur.next; + count++; + } + // 当是偶数的话,需要做额外处理 + if(list.length % 2 == 0){ + cur.next = list[l]; + cur = cur.next; + } + // 注意结尾要结束一波 + cur.next = null; +} + +// 方法二 使用双端队列的方法来解决 js中运行很慢 +var reorderList = function(head, s = [], tmp) { + // js数组作为双端队列 + const deque = []; + // 这里是取head的下一个节点,head不需要再入队了,避免造成重复 + let cur = head.next; + while(cur != null){ + deque.push(cur); + cur = cur.next; + } + cur = head; // 回到头部 + let count = 0; + while(deque.length !== 0){ + if(count % 2 == 0){ + // even,取出队列右边尾部的值 + cur.next = deque.pop(); + } else { + // odd, 取出队列左边头部的值 + cur.next = deque.shift(); + } + cur = cur.next; + count++; + } + cur.next = null; +} + +//方法三 将链表分割成两个链表,然后把第二个链表反转,之后在通过两个链表拼接成新的链表 +var reorderList = function(head, s = [], tmp) { + const reverseList = head => { + let headNode = new ListNode(0); + let cur = head; + let next = null; + while(cur != null){ + next = cur.next; + cur.next = headNode.next; + headNode.next = cur; + cur = next; + } + return headNode.next; + } + + let fast = head, slow = head; + //求出中点 + while(fast.next != null && fast.next.next != null){ + slow = slow.next; + fast = fast.next.next; + } + //right就是右半部分 12345 就是45 1234 就是34 + let right = slow.next; + //断开左部分和右部分 + slow.next = null; + //反转右部分 right就是反转后右部分的起点 + right = reverseList(right); + //左部分的起点 + let left = head; + //进行左右部分来回连接 + //这里左部分的节点个数一定大于等于右部分的节点个数 因此只判断right即可 + while (right != null) { + let curLeft = left.next; + left.next = right; + left = curLeft; + + let curRight = right.next; + right.next = left; + right = curRight; + } +} +``` ----------------------- From 8605f26bd762cd734e697ba7da9b3085d8f9db4d Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Tue, 28 Sep 2021 11:43:20 +0800 Subject: [PATCH 140/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E127.=20=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E6=8E=A5=E9=BE=99=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0127.单词接龙.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/problems/0127.单词接龙.md b/problems/0127.单词接龙.md index e38453ef..c52f2ba5 100644 --- a/problems/0127.单词接龙.md +++ b/problems/0127.单词接龙.md @@ -141,6 +141,40 @@ public int ladderLength(String beginWord, String endWord, List wordList) ## Go ## JavaScript +```javascript +var ladderLength = function(beginWord, endWord, wordList) { + // 将wordList转成Set,提高查询速度 + const wordSet = new Set(wordList); + // Set元素个数为0 或者 endWord没有在wordSet出现,直接返回0 + if (wordSet.size === 0 || !wordSet.has(endWord)) return 0; + // 记录word是否访问过 + const visitMap = new Map();// + // 初始化队列 + const queue = []; + queue.push(beginWord); + // 初始化visitMap + visitMap.set(beginWord, 1); + + while(queue.length !== 0){ + let word = queue.shift(); // 删除队首元素,将它的值存放在word + let path = visitMap.get(word); // 这个word的路径长度 + for(let i = 0; i < word.length; i++){ // 遍历单词的每个字符 + for (let c = 97; c <= 122; c++) { // 对应26个字母ASCII值 从'a' 到 'z' 遍历替换 + // 拼串得到新的字符串 + let newWord = word.slice(0, i) + String.fromCharCode(c) + word.slice(i + 1); + if(newWord === endWord) return path + 1; // 找到了end,返回path+1 + // wordSet出现了newWord,并且newWord没有被访问过 + if(wordSet.has(newWord) && !visitMap.has(newWord)) { + // 添加访问信息 + visitMap.set(newWord, path + 1); + queue.push(newWord); + } + } + } + } + return 0; +}; +``` ----------------------- From 09a045de9e0741c26c121ed44e81bd448b090e8f Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Tue, 28 Sep 2021 12:13:43 +0800 Subject: [PATCH 141/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E84.=20=E6=9F=B1?= =?UTF-8?q?=E7=8A=B6=E5=9B=BE=E4=B8=AD=E6=9C=80=E5=A4=A7=E7=9A=84=E7=9F=A9?= =?UTF-8?q?=E5=BD=A2=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0084.柱状图中最大的矩形.md | 75 ++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/problems/0084.柱状图中最大的矩形.md b/problems/0084.柱状图中最大的矩形.md index 57df4161..4e11d966 100644 --- a/problems/0084.柱状图中最大的矩形.md +++ b/problems/0084.柱状图中最大的矩形.md @@ -321,4 +321,79 @@ class Solution: return result ``` +JavaScript: +```javascript +//动态规划 js中运行速度最快 +var largestRectangleArea = function(heights) { + const len = heights.length; + const minLeftIndex = new Array(len); + const maxRigthIndex = new Array(len); + // 记录每个柱子 左边第一个小于该柱子的下标 + minLeftIndex[0] = -1; // 注意这里初始化,防止下面while死循环 + for(let i = 1; i < len; i++) { + let t = i - 1; + // 这里不是用if,而是不断向左寻找的过程 + while(t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t]; + minLeftIndex[i] = t; + } + // 记录每个柱子 右边第一个小于该柱子的下标 + maxRigthIndex[len - 1] = len; // 注意这里初始化,防止下面while死循环 + for(let i = len - 2; i >= 0; i--){ + let t = i + 1; + // 这里不是用if,而是不断向右寻找的过程 + while(t < len && heights[t] >= heights[i]) t = maxRigthIndex[t]; + maxRigthIndex[i] = t; + } + // 求和 + let maxArea = 0; + for(let i = 0; i < len; i++){ + let sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1); + maxArea = Math.max(maxArea , sum); + } + return maxArea; +}; + +//单调栈 +var largestRectangleArea = function(heights) { + let maxArea = 0; + const stack = []; + heights = [0,...heights,0]; // 数组头部加入元素0 数组尾部加入元素0 + for(let i = 0; i < heights.length; i++){ + if(heights[i] > heights[stack[stack.length-1]]){ // 情况三 + stack.push(i); + } else if(heights[i] === heights[stack[stack.length-1]]){ // 情况二 + stack.pop(); // 这个可以加,可以不加,效果一样,思路不同 + stack.push(i); + } else { // 情况一 + while(heights[i] < heights[stack[stack.length-1]]){// 当前bar比栈顶bar矮 + const stackTopIndex = stack.pop();// 栈顶元素出栈,并保存栈顶bar的索引 + let w = i - stack[stack.length -1] - 1; + let h = heights[stackTopIndex] + // 计算面积,并取最大面积 + maxArea = Math.max(maxArea, w * h); + } + stack.push(i);// 当前bar比栈顶bar高了,入栈 + } + } + return maxArea; +}; + +//单调栈 简洁 +var largestRectangleArea = function(heights) { + let maxArea = 0; + const stack = []; + heights = [0,...heights,0]; // 数组头部加入元素0 数组尾部加入元素0 + for(let i = 0; i < heights.length; i++){ // 只用考虑情况一 当前遍历的元素heights[i]小于栈顶元素heights[stack[stack.length-1]]]的情况 + while(heights[i] < heights[stack[stack.length-1]]){// 当前bar比栈顶bar矮 + const stackTopIndex = stack.pop();// 栈顶元素出栈,并保存栈顶bar的索引 + let w = i - stack[stack.length -1] - 1; + let h = heights[stackTopIndex] + // 计算面积,并取最大面积 + maxArea = Math.max(maxArea, w * h); + } + stack.push(i);// 当前bar比栈顶bar高了,入栈 + } + return maxArea; +}; +```

From 827cc69b7141a7dedfa2c4363c5d827d81383c47 Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Tue, 28 Sep 2021 12:29:50 +0800 Subject: [PATCH 142/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E52.=20N=E7=9A=87?= =?UTF-8?q?=E5=90=8E=20II=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0052.N皇后II.md | 44 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/problems/0052.N皇后II.md b/problems/0052.N皇后II.md index 1a34f763..d7d7feb8 100644 --- a/problems/0052.N皇后II.md +++ b/problems/0052.N皇后II.md @@ -101,4 +101,48 @@ public: ``` # 其他语言补充 +JavaScript +```javascript +var totalNQueens = function(n) { + let count = 0; + const backtracking = (n, row, chessboard) => { + if(row === n){ + count++; + return; + } + for(let col = 0; col < n; col++){ + if(isValid(row, col, chessboard, n)) { // 验证合法就可以放 + chessboard[row][col] = 'Q'; // 放置皇后 + backtracking(n, row + 1, chessboard); + chessboard[row][col] = '.'; // 回溯 + } + } + } + const isValid = (row, col, chessboard, n) => { + // 检查列 + for(let i = 0; i < row; i++){ // 这是一个剪枝 + if(chessboard[i][col] === 'Q'){ + return false; + } + } + // 检查 45度角是否有皇后 + for(let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){ + if(chessboard[i][j] === 'Q'){ + return false; + } + } + // 检查 135度角是否有皇后 + for(let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++){ + if(chessboard[i][j] === 'Q'){ + return false; + } + } + return true; + } + + const chessboard = new Array(n).fill([]).map(() => new Array(n).fill('.')); + backtracking(n, 0, chessboard); + return count; +}; +``` From 089c8325f5e66617b861c0b7ed368d8ea8d026a6 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Tue, 28 Sep 2021 14:05:37 +0800 Subject: [PATCH 143/222] =?UTF-8?q?=E8=A7=A3=E5=86=B3=200455=20=E5=88=86?= =?UTF-8?q?=E5=8F=91=E9=A5=BC=E5=B9=B2=20JavaScript=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B2=A1=E6=9C=89=E6=A0=B7=E5=BC=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0455.分发饼干.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0455.分发饼干.md b/problems/0455.分发饼干.md index bae1566c..abd4712b 100644 --- a/problems/0455.分发饼干.md +++ b/problems/0455.分发饼干.md @@ -200,7 +200,7 @@ func findContentChildren(g []int, s []int) int { ``` Javascript: -``` +```js var findContentChildren = function(g, s) { g = g.sort((a, b) => a - b) s = s.sort((a, b) => a - b) From 8c03e8d213cbc62a85ab66f97bf2b09179f69e7a Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 28 Sep 2021 15:44:04 +0800 Subject: [PATCH 144/222] Update --- problems/0093.复原IP地址.md | 93 ++++++++++-------------------- problems/其他/参与本项目.md | 4 ++ 2 files changed, 34 insertions(+), 63 deletions(-) diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 52db821a..7639bea2 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -8,7 +8,7 @@ -## 93.复原IP地址 +# 93.复原IP地址 [力扣题目链接](https://leetcode-cn.com/problems/restore-ip-addresses/) @@ -19,31 +19,31 @@ 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效的 IP 地址。 示例 1: -输入:s = "25525511135" -输出:["255.255.11.135","255.255.111.35"] +* 输入:s = "25525511135" +* 输出:["255.255.11.135","255.255.111.35"] 示例 2: -输入:s = "0000" -输出:["0.0.0.0"] +* 输入:s = "0000" +* 输出:["0.0.0.0"] 示例 3: -输入:s = "1111" -输出:["1.1.1.1"] +* 输入:s = "1111" +* 输出:["1.1.1.1"] 示例 4: -输入:s = "010010" -输出:["0.10.0.10","0.100.1.0"] +* 输入:s = "010010" +* 输出:["0.10.0.10","0.100.1.0"] 示例 5: -输入:s = "101023" -输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"] +* 输入:s = "101023" +* 输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"] 提示: -0 <= s.length <= 3000 -s 仅由数字组成 +* 0 <= s.length <= 3000 +* s 仅由数字组成 -## 思路 +# 思路 做这道题目之前,最好先把[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)这个做了。 @@ -114,7 +114,7 @@ if (pointNum == 3) { // 逗点数量为3时,分隔结束 代码如下: -``` +```CPP for (int i = startIndex; i < s.size(); i++) { if (isValid(s, startIndex, i)) { // 判断 [startIndex,i] 这个区间的子串是否合法 s.insert(s.begin() + i + 1 , '.'); // 在i的后面插入一个逗点 @@ -138,7 +138,7 @@ for (int i = startIndex; i < s.size(); i++) { 代码如下: -``` +```CPP // 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法 bool isValid(const string& s, int start, int end) { if (start > end) { @@ -237,7 +237,7 @@ public: ``` -## 总结 +# 总结 在[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)中我列举的分割字符串的难点,本题都覆盖了。 @@ -249,9 +249,9 @@ public: -## 其他语言版本 +# 其他语言版本 -java 版本: +## java ```java class Solution { @@ -308,7 +308,9 @@ class Solution { } ``` -python版本: +## python + +python2: ```python class Solution: def restoreIpAddresses(self, s: str) -> List[str]: @@ -338,6 +340,8 @@ class Solution: backtrack(s, 0) return res ``` + +python3: ```python class Solution(object): def restoreIpAddresses(self, s): @@ -366,47 +370,8 @@ class Solution(object): return ans``` ``` -```python3 -class Solution: - def __init__(self) -> None: - self.s = "" - self.res = [] - def isVaild(self, s: str) -> bool: - if len(s) > 1 and s[0] == "0": - return False - - if 0 <= int(s) <= 255: - return True - - return False - - def backTrack(self, path: List[str], start: int) -> None: - if start == len(self.s) and len(path) == 4: - self.res.append(".".join(path)) - return - - for end in range(start + 1, len(self.s) + 1): - # 剪枝 - # 保证切割完,s没有剩余的字符。 - if len(self.s) - end > 3 * (4 - len(path) - 1): - continue - if self.isVaild(self.s[start:end]): - # 在参数处,更新状态,实则创建一个新的变量 - # 不会影响当前的状态,当前的path变量没有改变 - # 因此递归完不用path.pop() - self.backTrack(path + [self.s[start:end]], end) - - def restoreIpAddresses(self, s: str) -> List[str]: - # prune - if len(s) > 3 * 4: - return [] - self.s = s - self.backTrack([], 0) - return self.res -``` - -JavaScript: +## JavaScript ```js /** @@ -435,8 +400,10 @@ var restoreIpAddresses = function(s) { } }; ``` -Go: -> 回溯(对于前导 0的IP(特别注意s[startIndex]=='0'的判断,不应该写成s[startIndex]==0,因为s截取出来不是数字)) + +## Go + +回溯(对于前导 0的IP(特别注意s[startIndex]=='0'的判断,不应该写成s[startIndex]==0,因为s截取出来不是数字)) ```go func restoreIpAddresses(s string) []string { @@ -476,7 +443,7 @@ func isNormalIp(s string,startIndex,end int)bool{ ``` -C: +## C ```c //记录结果 char** result; diff --git a/problems/其他/参与本项目.md b/problems/其他/参与本项目.md index cfa75439..76a2c61e 100644 --- a/problems/其他/参与本项目.md +++ b/problems/其他/参与本项目.md @@ -9,3 +9,7 @@ git add之前,要git diff 查看一下,本次提交所修改的代码是不是 自己修改的,是否 误删,或者误加的文件。 提交代码,不要使用git push -f 这种命令,要足够了解 -f 意味着什么。 + + +不用非要写出牛逼的代码才能提交PR,只要发现 文章中有任何问题,或者错别字,都欢迎提交PR,成为contributor。 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210927113149.png) From 70ce257d4569a77b1c310708559da35f59a5ae2c Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 28 Sep 2021 15:54:27 +0800 Subject: [PATCH 145/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0001.两数之和.md | 2 +- problems/0005.最长回文子串.md | 8 ++++---- problems/0015.三数之和.md | 2 +- problems/0017.电话号码的字母组合.md | 2 +- problems/0018.四数之和.md | 2 +- .../0019.删除链表的倒数第N个节点.md | 2 +- problems/0020.有效的括号.md | 2 +- .../0024.两两交换链表中的节点.md | 2 +- problems/0027.移除元素.md | 2 +- problems/0028.实现strStr.md | 2 +- problems/0031.下一个排列.md | 6 +++--- ...元素的第一个和最后一个位置.md | 6 +++--- problems/0035.搜索插入位置.md | 2 +- problems/0037.解数独.md | 2 +- problems/0039.组合总和.md | 2 +- problems/0040.组合总和II.md | 2 +- problems/0042.接雨水.md | 4 ++-- problems/0045.跳跃游戏II.md | 2 +- problems/0046.全排列.md | 2 +- problems/0047.全排列II.md | 2 +- problems/0051.N皇后.md | 2 +- problems/0052.N皇后II.md | 7 ++++++- problems/0053.最大子序和.md | 2 +- .../0053.最大子序和(动态规划).md | 2 +- problems/0055.跳跃游戏.md | 2 +- problems/0056.合并区间.md | 2 +- problems/0059.螺旋矩阵II.md | 2 +- problems/0062.不同路径.md | 2 +- problems/0063.不同路径II.md | 2 +- problems/0070.爬楼梯.md | 2 +- problems/0070.爬楼梯完全背包版本.md | 2 +- problems/0072.编辑距离.md | 7 +------ problems/0077.组合.md | 2 +- problems/0077.组合优化.md | 2 +- problems/0078.子集.md | 2 +- problems/0084.柱状图中最大的矩形.md | 13 ++++++++++++- problems/0090.子集II.md | 2 +- problems/0093.复原IP地址.md | 2 +- problems/0096.不同的二叉搜索树.md | 2 +- problems/0098.验证二叉搜索树.md | 2 +- problems/0100.相同的树.md | 6 +++--- problems/0101.对称二叉树.md | 2 +- problems/0102.二叉树的层序遍历.md | 2 +- problems/0104.二叉树的最大深度.md | 2 +- ...序与后序遍历序列构造二叉树.md | 2 +- ....将有序数组转换为二叉搜索树.md | 2 +- problems/0110.平衡二叉树.md | 2 +- problems/0111.二叉树的最小深度.md | 2 +- problems/0112.路径总和.md | 2 +- problems/0115.不同的子序列.md | 2 +- ...个节点的下一个右侧节点指针.md | 6 +++--- problems/0121.买卖股票的最佳时机.md | 2 +- problems/0122.买卖股票的最佳时机II.md | 2 +- ...票的最佳时机II(动态规划).md | 2 +- .../0123.买卖股票的最佳时机III.md | 2 +- problems/0127.单词接龙.md | 4 ++-- .../0129.求根到叶子节点数字之和.md | 9 ++++++++- problems/0131.分割回文串.md | 2 +- problems/0132.分割回文串II.md | 6 +++--- problems/0134.加油站.md | 2 +- problems/0135.分发糖果.md | 2 +- problems/0139.单词拆分.md | 2 +- problems/0141.环形链表.md | 6 +++--- problems/0142.环形链表II.md | 2 +- problems/0143.重排链表.md | 10 ++++------ problems/0150.逆波兰表达式求值.md | 2 +- problems/0151.翻转字符串里的单词.md | 2 +- problems/0160.相交链表.md | 13 ++++++++++++- problems/0188.买卖股票的最佳时机IV.md | 2 +- problems/0189.旋转数组.md | 8 ++++---- problems/0198.打家劫舍.md | 2 +- problems/0202.快乐数.md | 2 +- problems/0203.移除链表元素.md | 2 +- problems/0205.同构字符串.md | 6 +++--- problems/0206.翻转链表.md | 2 +- problems/0209.长度最小的子数组.md | 2 +- problems/0213.打家劫舍II.md | 2 +- problems/0216.组合总和III.md | 2 +- .../0222.完全二叉树的节点个数.md | 2 +- problems/0225.用队列实现栈.md | 2 +- problems/0226.翻转二叉树.md | 2 +- problems/0232.用栈实现队列.md | 2 +- problems/0234.回文链表.md | 6 +++--- ...235.二叉搜索树的最近公共祖先.md | 2 +- .../0236.二叉树的最近公共祖先.md | 2 +- problems/0239.滑动窗口最大值.md | 2 +- problems/0242.有效的字母异位词.md | 2 +- problems/0257.二叉树的所有路径.md | 2 +- problems/0279.完全平方数.md | 2 +- problems/0283.移动零.md | 6 +++--- problems/0300.最长上升子序列.md | 2 +- ...309.最佳买卖股票时机含冷冻期.md | 2 +- problems/0322.零钱兑换.md | 2 +- problems/0332.重新安排行程.md | 2 +- problems/0337.打家劫舍III.md | 2 +- problems/0343.整数拆分.md | 2 +- problems/0344.反转字符串.md | 2 +- problems/0347.前K个高频元素.md | 2 +- problems/0349.两个数组的交集.md | 2 +- problems/0376.摆动序列.md | 2 +- problems/0377.组合总和Ⅳ.md | 2 +- problems/0383.赎金信.md | 2 +- problems/0392.判断子序列.md | 2 +- problems/0404.左叶子之和.md | 2 +- problems/0406.根据身高重建队列.md | 2 +- problems/0416.分割等和子集.md | 2 +- problems/0435.无重叠区间.md | 2 +- .../0450.删除二叉搜索树中的节点.md | 2 +- .../0452.用最少数量的箭引爆气球.md | 2 +- problems/0454.四数相加II.md | 2 +- problems/0455.分发饼干.md | 2 +- problems/0459.重复的子字符串.md | 2 +- problems/0463.岛屿的周长.md | 9 ++++++++- problems/0474.一和零.md | 2 +- problems/0491.递增子序列.md | 2 +- problems/0494.目标和.md | 2 +- problems/0496.下一个更大元素I.md | 13 ++++++++++++- problems/0501.二叉搜索树中的众数.md | 2 +- problems/0503.下一个更大元素II.md | 13 ++++++++++++- problems/0509.斐波那契数.md | 2 +- problems/0513.找树左下角的值.md | 2 +- problems/0516.最长回文子序列.md | 2 +- problems/0518.零钱兑换II.md | 2 +- .../0530.二叉搜索树的最小绝对差.md | 2 +- ...538.把二叉搜索树转换为累加树.md | 2 +- problems/0541.反转字符串II.md | 2 +- .../0583.两个字符串的删除操作.md | 2 +- problems/0617.合并二叉树.md | 2 +- problems/0647.回文子串.md | 2 +- problems/0649.Dota2参议院.md | 6 +++--- problems/0654.最大二叉树.md | 2 +- problems/0657.机器人能否返回原点.md | 6 +++--- problems/0669.修剪二叉搜索树.md | 2 +- .../0673.最长递增子序列的个数.md | 6 +++--- problems/0674.最长连续递增序列.md | 2 +- problems/0684.冗余连接.md | 18 +++++++++--------- problems/0685.冗余连接II.md | 8 +++----- problems/0700.二叉搜索树中的搜索.md | 2 +- .../0701.二叉搜索树中的插入操作.md | 2 +- problems/0704.二分查找.md | 2 +- problems/0707.设计链表.md | 2 +- ....买卖股票的最佳时机含手续费.md | 2 +- ...佳时机含手续费(动态规划).md | 2 +- problems/0718.最长重复子数组.md | 2 +- problems/0724.寻找数组的中心索引.md | 6 +++--- problems/0738.单调递增的数字.md | 2 +- problems/0739.每日温度.md | 6 +++--- problems/0746.使用最小花费爬楼梯.md | 2 +- problems/0763.划分字母区间.md | 2 +- problems/0841.钥匙和房间.md | 6 +++--- problems/0844.比较含退格的字符串.md | 6 +++--- problems/0860.柠檬水找零.md | 2 +- problems/0922.按奇偶排序数组II.md | 6 +++--- problems/0925.长按键入.md | 6 +++--- problems/0941.有效的山脉数组.md | 10 +++++----- problems/0968.监控二叉树.md | 2 +- problems/0977.有序数组的平方.md | 2 +- problems/1002.查找常用字符.md | 4 ++-- .../1005.K次取反后最大化的数组和.md | 2 +- problems/1035.不相交的线.md | 2 +- ...除字符串中的所有相邻重复项.md | 2 +- problems/1049.最后一块石头的重量II.md | 2 +- problems/1143.最长公共子序列.md | 2 +- problems/1207.独一无二的出现次数.md | 4 ++-- problems/1221.分割平衡字符串.md | 4 ++-- ...根据数字二进制下1的数目排序.md | 6 +++--- ...365.有多少小于当前数字的数字.md | 4 ++-- problems/1382.将二叉搜索树变平衡.md | 8 ++++---- ...超时了,此时的n究竟是多大?.md | 2 +- ...编辑距离,卡尔做了三步铺垫.md | 2 +- problems/二叉树中递归带着回溯.md | 2 +- problems/二叉树总结篇.md | 2 +- problems/二叉树理论基础.md | 2 +- problems/二叉树的统一迭代法.md | 2 +- problems/二叉树的迭代遍历.md | 2 +- problems/二叉树的递归遍历.md | 2 +- ...杂度,你不知道的都在这里!.md | 2 +- problems/剑指Offer05.替换空格.md | 2 +- .../剑指Offer58-II.左旋转字符串.md | 2 +- problems/动态规划-股票问题总结篇.md | 2 +- problems/动态规划总结篇.md | 6 +++--- problems/动态规划理论基础.md | 2 +- problems/双指针总结.md | 2 +- problems/哈希表总结.md | 2 +- problems/哈希表理论基础.md | 2 +- problems/回溯总结.md | 2 +- ...溯算法去重问题的另一种写法.md | 2 +- problems/回溯算法理论基础.md | 2 +- problems/字符串总结.md | 2 +- problems/数组总结篇.md | 2 +- problems/数组理论基础.md | 2 +- problems/栈与队列总结.md | 2 +- problems/栈与队列理论基础.md | 2 +- ...高重建队列(vector原理讲解).md | 2 +- problems/算法模板.md | 2 +- problems/背包总结篇.md | 2 +- problems/背包理论基础01背包-1.md | 2 +- problems/背包理论基础01背包-2.md | 2 +- .../背包问题理论基础多重背包.md | 2 +- .../背包问题理论基础完全背包.md | 2 +- problems/贪心算法总结篇.md | 2 +- problems/贪心算法理论基础.md | 2 +- problems/链表总结篇.md | 2 +- problems/链表理论基础.md | 2 +- problems/面试题02.07.链表相交.md | 2 +- 205 files changed, 340 insertions(+), 286 deletions(-) diff --git a/problems/0001.两数之和.md b/problems/0001.两数之和.md index a6381eff..0ef73c6a 100644 --- a/problems/0001.两数之和.md +++ b/problems/0001.两数之和.md @@ -253,4 +253,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md index c78b827c..626ceaf6 100644 --- a/problems/0005.最长回文子串.md +++ b/problems/0005.最长回文子串.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 5.最长回文子串 [力扣题目链接](https://leetcode-cn.com/problems/longest-palindromic-substring/) @@ -299,10 +299,10 @@ class Solution: ```js ``` + + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - - -
+
diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index d3d7f61e..d00b76bd 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -441,4 +441,4 @@ func threeSum(_ nums: [Int]) -> [[Int]] { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md index ef485a39..3dff97e5 100644 --- a/problems/0017.电话号码的字母组合.md +++ b/problems/0017.电话号码的字母组合.md @@ -475,4 +475,4 @@ char ** letterCombinations(char * digits, int* returnSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index e283b291..ddeb3c96 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -407,4 +407,4 @@ func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0019.删除链表的倒数第N个节点.md b/problems/0019.删除链表的倒数第N个节点.md index 85e3eb48..f54b1629 100644 --- a/problems/0019.删除链表的倒数第N个节点.md +++ b/problems/0019.删除链表的倒数第N个节点.md @@ -233,4 +233,4 @@ func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0020.有效的括号.md b/problems/0020.有效的括号.md index 5b02f9ee..918a3560 100644 --- a/problems/0020.有效的括号.md +++ b/problems/0020.有效的括号.md @@ -290,4 +290,4 @@ var isValid = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0024.两两交换链表中的节点.md b/problems/0024.两两交换链表中的节点.md index 75a5f739..19c2a06e 100644 --- a/problems/0024.两两交换链表中的节点.md +++ b/problems/0024.两两交换链表中的节点.md @@ -283,4 +283,4 @@ func swapPairs(_ head: ListNode?) -> ListNode? { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index 4afd347a..21216945 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -290,4 +290,4 @@ int removeElement(int* nums, int numsSize, int val){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index 481be2ed..35bec96d 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -902,4 +902,4 @@ var strStr = function (haystack, needle) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0031.下一个排列.md b/problems/0031.下一个排列.md index 05321a9a..587885e4 100644 --- a/problems/0031.下一个排列.md +++ b/problems/0031.下一个排列.md @@ -1,4 +1,3 @@ -

@@ -9,6 +8,7 @@ + # 31.下一个排列 [力扣题目链接](https://leetcode-cn.com/problems/next-permutation/) @@ -134,9 +134,9 @@ class Solution { ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -

+
diff --git a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md index 68dd797d..1d7cabe3 100644 --- a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md +++ b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 34. 在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 @@ -398,9 +398,9 @@ class Solution: ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md index a536f0ec..b25bfe54 100644 --- a/problems/0035.搜索插入位置.md +++ b/problems/0035.搜索插入位置.md @@ -313,4 +313,4 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0037.解数独.md b/problems/0037.解数独.md index 94c5c198..468cd3a6 100644 --- a/problems/0037.解数独.md +++ b/problems/0037.解数独.md @@ -556,4 +556,4 @@ void solveSudoku(char** board, int boardSize, int* boardColSize) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index 4836de9c..369d1cb9 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -405,4 +405,4 @@ int** combinationSum(int* candidates, int candidatesSize, int target, int* retur * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index d6f4dac9..6d0460eb 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -458,4 +458,4 @@ int** combinationSum2(int* candidates, int candidatesSize, int target, int* retu * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 16c788eb..43daa1b0 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ > 这个图就是大厂面试经典题目,接雨水! 最常青藤的一道题,面试官百出不厌! # 42. 接雨水 @@ -577,4 +577,4 @@ int trap(int* height, int heightSize) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0045.跳跃游戏II.md b/problems/0045.跳跃游戏II.md index 8dd59838..31b6ee2e 100644 --- a/problems/0045.跳跃游戏II.md +++ b/problems/0045.跳跃游戏II.md @@ -236,4 +236,4 @@ var jump = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0046.全排列.md b/problems/0046.全排列.md index 001c249e..bba7dd6a 100644 --- a/problems/0046.全排列.md +++ b/problems/0046.全排列.md @@ -315,4 +315,4 @@ var permute = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0047.全排列II.md b/problems/0047.全排列II.md index c5de73c7..085b686e 100644 --- a/problems/0047.全排列II.md +++ b/problems/0047.全排列II.md @@ -338,4 +338,4 @@ func backTring(nums,subRes []int,res *[][]int,used []bool){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md index c141c326..fa2d2ab7 100644 --- a/problems/0051.N皇后.md +++ b/problems/0051.N皇后.md @@ -499,4 +499,4 @@ var solveNQueens = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0052.N皇后II.md b/problems/0052.N皇后II.md index 1a34f763..4c08071b 100644 --- a/problems/0052.N皇后II.md +++ b/problems/0052.N皇后II.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 52. N皇后II 题目链接:https://leetcode-cn.com/problems/n-queens-ii/ @@ -102,3 +102,8 @@ public: # 其他语言补充 +----------------------- +* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) +* B站视频:[代码随想录](https://space.bilibili.com/525438321) +* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +
diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index 18d3007e..da67bfd7 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -216,4 +216,4 @@ var maxSubArray = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0053.最大子序和(动态规划).md b/problems/0053.最大子序和(动态规划).md index 4c2a2944..ebf4541c 100644 --- a/problems/0053.最大子序和(动态规划).md +++ b/problems/0053.最大子序和(动态规划).md @@ -192,4 +192,4 @@ const maxSubArray = nums => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0055.跳跃游戏.md b/problems/0055.跳跃游戏.md index c9ebe0fe..0c936131 100644 --- a/problems/0055.跳跃游戏.md +++ b/problems/0055.跳跃游戏.md @@ -161,4 +161,4 @@ var canJump = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0056.合并区间.md b/problems/0056.合并区间.md index 82ca29e6..6332d5a9 100644 --- a/problems/0056.合并区间.md +++ b/problems/0056.合并区间.md @@ -248,4 +248,4 @@ var merge = function (intervals) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 733ec749..99750f60 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -542,4 +542,4 @@ int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0062.不同路径.md b/problems/0062.不同路径.md index ce29cca1..4d0381e0 100644 --- a/problems/0062.不同路径.md +++ b/problems/0062.不同路径.md @@ -333,4 +333,4 @@ var uniquePaths = function(m, n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0063.不同路径II.md b/problems/0063.不同路径II.md index c01846bd..322de75e 100644 --- a/problems/0063.不同路径II.md +++ b/problems/0063.不同路径II.md @@ -341,4 +341,4 @@ var uniquePathsWithObstacles = function(obstacleGrid) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0070.爬楼梯.md b/problems/0070.爬楼梯.md index 4f049e4a..54d026ab 100644 --- a/problems/0070.爬楼梯.md +++ b/problems/0070.爬楼梯.md @@ -301,4 +301,4 @@ var climbStairs = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0070.爬楼梯完全背包版本.md b/problems/0070.爬楼梯完全背包版本.md index 4410dbaf..6fc1a50d 100644 --- a/problems/0070.爬楼梯完全背包版本.md +++ b/problems/0070.爬楼梯完全背包版本.md @@ -192,4 +192,4 @@ func climbStairs(n int) int { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0072.编辑距离.md b/problems/0072.编辑距离.md index 2045c1fd..ca8e85b8 100644 --- a/problems/0072.编辑距离.md +++ b/problems/0072.编辑距离.md @@ -51,7 +51,6 @@ exection -> execution (插入 'u') 接下来我依然使用动规五部曲,对本题做一个详细的分析: ------------------------ ### 1. 确定dp数组(dp table)以及下标的含义 @@ -61,7 +60,6 @@ exection -> execution (插入 'u') 用i来表示也可以! 但我统一以下标i-1为结尾的字符串,在下面的递归公式中会容易理解一点。 ------------------------ ### 2. 确定递推公式 @@ -156,7 +154,6 @@ for (int i = 0; i <= word1.size(); i++) dp[i][0] = i; for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; ``` ------------------------ ### 4. 确定遍历顺序 @@ -187,7 +184,6 @@ for (int i = 1; i <= word1.size(); i++) { } } ``` ------------------------ ### 5. 举例推导dp数组 @@ -220,7 +216,6 @@ public: }; ``` ------------------------ ## 其他语言版本 @@ -338,4 +333,4 @@ const minDistance = (word1, word2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0077.组合.md b/problems/0077.组合.md index c63e45f5..6f6f89a6 100644 --- a/problems/0077.组合.md +++ b/problems/0077.组合.md @@ -627,4 +627,4 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0077.组合优化.md b/problems/0077.组合优化.md index 136ceb34..02b30d3d 100644 --- a/problems/0077.组合优化.md +++ b/problems/0077.组合优化.md @@ -300,4 +300,4 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0078.子集.md b/problems/0078.子集.md index 747b89d1..39f6ed5d 100644 --- a/problems/0078.子集.md +++ b/problems/0078.子集.md @@ -325,4 +325,4 @@ int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0084.柱状图中最大的矩形.md b/problems/0084.柱状图中最大的矩形.md index 57df4161..a0c30099 100644 --- a/problems/0084.柱状图中最大的矩形.md +++ b/problems/0084.柱状图中最大的矩形.md @@ -1,3 +1,10 @@ +

+ + + + +

+

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 84.柱状图中最大的矩形 @@ -321,4 +328,8 @@ class Solution: return result ``` -
+----------------------- +* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) +* B站视频:[代码随想录](https://space.bilibili.com/525438321) +* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +
diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index e970d752..d2a9279f 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -353,4 +353,4 @@ int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColum * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 7639bea2..26103318 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -524,4 +524,4 @@ char ** restoreIpAddresses(char * s, int* returnSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0096.不同的二叉搜索树.md b/problems/0096.不同的二叉搜索树.md index 68ab11c8..76d7d353 100644 --- a/problems/0096.不同的二叉搜索树.md +++ b/problems/0096.不同的二叉搜索树.md @@ -234,4 +234,4 @@ const numTrees =(n) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0098.验证二叉搜索树.md b/problems/0098.验证二叉搜索树.md index 6d054634..c7e5b4e6 100644 --- a/problems/0098.验证二叉搜索树.md +++ b/problems/0098.验证二叉搜索树.md @@ -529,4 +529,4 @@ var isValidBST = function (root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0100.相同的树.md b/problems/0100.相同的树.md index 6ffaf3cb..c7431c5e 100644 --- a/problems/0100.相同的树.md +++ b/problems/0100.相同的树.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 100. 相同的树 [力扣题目链接](https://leetcode-cn.com/problems/same-tree/) @@ -242,9 +242,9 @@ Go: JavaScript: + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0101.对称二叉树.md b/problems/0101.对称二叉树.md index 3abf26cb..196e0b58 100644 --- a/problems/0101.对称二叉树.md +++ b/problems/0101.对称二叉树.md @@ -582,4 +582,4 @@ var isSymmetric = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 5128d6ec..df1790c3 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1778,4 +1778,4 @@ JavaScript: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0104.二叉树的最大深度.md b/problems/0104.二叉树的最大深度.md index 516cf5f1..4162de80 100644 --- a/problems/0104.二叉树的最大深度.md +++ b/problems/0104.二叉树的最大深度.md @@ -586,4 +586,4 @@ var maxDepth = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index a9639d8f..68f4419a 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -823,4 +823,4 @@ var buildTree = function(preorder, inorder) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0108.将有序数组转换为二叉搜索树.md b/problems/0108.将有序数组转换为二叉搜索树.md index f7bff27d..9b260db1 100644 --- a/problems/0108.将有序数组转换为二叉搜索树.md +++ b/problems/0108.将有序数组转换为二叉搜索树.md @@ -362,4 +362,4 @@ var sortedArrayToBST = function (nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index 43a49758..bd2fe432 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -624,4 +624,4 @@ var isBalanced = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0111.二叉树的最小深度.md b/problems/0111.二叉树的最小深度.md index 12eadd60..3cfed997 100644 --- a/problems/0111.二叉树的最小深度.md +++ b/problems/0111.二叉树的最小深度.md @@ -413,4 +413,4 @@ var minDepth = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index da62452c..9bb470e6 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -711,4 +711,4 @@ var pathsum = function(root, targetsum) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0115.不同的子序列.md b/problems/0115.不同的子序列.md index 908682dd..3de9b3e1 100644 --- a/problems/0115.不同的子序列.md +++ b/problems/0115.不同的子序列.md @@ -274,4 +274,4 @@ const numDistinct = (s, t) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0116.填充每个节点的下一个右侧节点指针.md b/problems/0116.填充每个节点的下一个右侧节点指针.md index e43d79b0..be6c31e8 100644 --- a/problems/0116.填充每个节点的下一个右侧节点指针.md +++ b/problems/0116.填充每个节点的下一个右侧节点指针.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 116. 填充每个节点的下一个右侧节点指针 [力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/) @@ -255,9 +255,9 @@ const connect = root => { }; ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0121.买卖股票的最佳时机.md b/problems/0121.买卖股票的最佳时机.md index b08e4193..9592c442 100644 --- a/problems/0121.买卖股票的最佳时机.md +++ b/problems/0121.买卖股票的最佳时机.md @@ -360,4 +360,4 @@ const maxProfit = prices => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 4bbe9e5e..591226ba 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -286,4 +286,4 @@ int maxProfit(int* prices, int pricesSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0122.买卖股票的最佳时机II(动态规划).md b/problems/0122.买卖股票的最佳时机II(动态规划).md index c324d392..31a8e6dc 100644 --- a/problems/0122.买卖股票的最佳时机II(动态规划).md +++ b/problems/0122.买卖股票的最佳时机II(动态规划).md @@ -246,4 +246,4 @@ const maxProfit = (prices) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0123.买卖股票的最佳时机III.md b/problems/0123.买卖股票的最佳时机III.md index 6a849c80..80aa740f 100644 --- a/problems/0123.买卖股票的最佳时机III.md +++ b/problems/0123.买卖股票的最佳时机III.md @@ -324,4 +324,4 @@ const maxProfit = prices => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0127.单词接龙.md b/problems/0127.单词接龙.md index e38453ef..5d0426ed 100644 --- a/problems/0127.单词接龙.md +++ b/problems/0127.单词接龙.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 127. 单词接龙 [力扣题目链接](https://leetcode-cn.com/problems/word-ladder/) @@ -147,4 +147,4 @@ public int ladderLength(String beginWord, String endWord, List wordList) * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md index 696042a8..4d9c7524 100644 --- a/problems/0129.求根到叶子节点数字之和.md +++ b/problems/0129.求根到叶子节点数字之和.md @@ -1,3 +1,10 @@ +

+ + + + +

+

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 129. 求根节点到叶节点数字之和 [力扣题目链接](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/) @@ -248,4 +255,4 @@ JavaScript: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index 08f091aa..81aa1522 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -424,4 +424,4 @@ var partition = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0132.分割回文串II.md b/problems/0132.分割回文串II.md index f9cbd618..2569068e 100644 --- a/problems/0132.分割回文串II.md +++ b/problems/0132.分割回文串II.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 132. 分割回文串 II [力扣题目链接](https://leetcode-cn.com/problems/palindrome-partitioning-ii/) @@ -249,9 +249,9 @@ class Solution: ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md index 526efb14..65bff8e9 100644 --- a/problems/0134.加油站.md +++ b/problems/0134.加油站.md @@ -379,4 +379,4 @@ int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0135.分发糖果.md b/problems/0135.分发糖果.md index 526b5870..dddb4488 100644 --- a/problems/0135.分发糖果.md +++ b/problems/0135.分发糖果.md @@ -242,4 +242,4 @@ var candy = function(ratings) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0139.单词拆分.md b/problems/0139.单词拆分.md index 969d2ce7..b3158cb3 100644 --- a/problems/0139.单词拆分.md +++ b/problems/0139.单词拆分.md @@ -319,4 +319,4 @@ const wordBreak = (s, wordDict) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0141.环形链表.md b/problems/0141.环形链表.md index 34b8d25f..ccebbc4e 100644 --- a/problems/0141.环形链表.md +++ b/problems/0141.环形链表.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 141. 环形链表 给定一个链表,判断链表中是否有环。 @@ -116,9 +116,9 @@ class Solution: ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0142.环形链表II.md b/problems/0142.环形链表II.md index bfa779a2..52ff7686 100644 --- a/problems/0142.环形链表II.md +++ b/problems/0142.环形链表II.md @@ -334,4 +334,4 @@ extension ListNode: Equatable { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index 2b4e68b7..382ed35c 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -221,7 +221,6 @@ public class ReorderList { } } -------------------------------------------------------------------------- // 方法一 Java实现,使用数组存储节点 class Solution { public void reorderList(ListNode head) { @@ -260,7 +259,6 @@ public class ReorderList { cur.next = null; } } -------------------------------------------------------------------------- // 方法二:使用双端队列,简化了数组的操作,代码相对于前者更简洁(避免一些边界条件) class Solution { public void reorderList(ListNode head) { @@ -352,11 +350,11 @@ Go: JavaScript: ------------------------ + + +----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - - -
+
diff --git a/problems/0150.逆波兰表达式求值.md b/problems/0150.逆波兰表达式求值.md index 36652109..859a6d98 100644 --- a/problems/0150.逆波兰表达式求值.md +++ b/problems/0150.逆波兰表达式求值.md @@ -248,4 +248,4 @@ class Solution: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index c4a9c7e0..7902a398 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -553,4 +553,4 @@ func reverseWord(_ s: inout [Character]) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0160.相交链表.md b/problems/0160.相交链表.md index 42b2ee56..ce7296b3 100644 --- a/problems/0160.相交链表.md +++ b/problems/0160.相交链表.md @@ -1,3 +1,14 @@ +

+ + + + +

+

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

同:[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html) -
+----------------------- +* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) +* B站视频:[代码随想录](https://space.bilibili.com/525438321) +* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +
diff --git a/problems/0188.买卖股票的最佳时机IV.md b/problems/0188.买卖股票的最佳时机IV.md index a166db72..a0520fb4 100644 --- a/problems/0188.买卖股票的最佳时机IV.md +++ b/problems/0188.买卖股票的最佳时机IV.md @@ -331,4 +331,4 @@ var maxProfit = function(k, prices) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0189.旋转数组.md b/problems/0189.旋转数组.md index 70aec5fe..a08ee83e 100644 --- a/problems/0189.旋转数组.md +++ b/problems/0189.旋转数组.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 189. 旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 @@ -149,10 +149,10 @@ var rotate = function (nums, k) { }; ``` + + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - - -
+
diff --git a/problems/0198.打家劫舍.md b/problems/0198.打家劫舍.md index c8645c48..4bf8a81a 100644 --- a/problems/0198.打家劫舍.md +++ b/problems/0198.打家劫舍.md @@ -198,4 +198,4 @@ const rob = nums => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0202.快乐数.md b/problems/0202.快乐数.md index 43c9d753..8f2e3bae 100644 --- a/problems/0202.快乐数.md +++ b/problems/0202.快乐数.md @@ -284,4 +284,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0203.移除链表元素.md b/problems/0203.移除链表元素.md index c4f187e8..61c3e8ef 100644 --- a/problems/0203.移除链表元素.md +++ b/problems/0203.移除链表元素.md @@ -362,4 +362,4 @@ func removeElements(head *ListNode, val int) *ListNode { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0205.同构字符串.md b/problems/0205.同构字符串.md index 5d20aa4a..421d29a8 100644 --- a/problems/0205.同构字符串.md +++ b/problems/0205.同构字符串.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 205. 同构字符串 [力扣题目链接](https://leetcode-cn.com/problems/isomorphic-strings/) @@ -121,9 +121,9 @@ func isIsomorphic(s string, t string) bool { ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index 45196386..3814b53d 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -375,4 +375,4 @@ func reverse(pre: ListNode?, cur: ListNode?) -> ListNode? { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md index 7c3fd0e7..fe3657c0 100644 --- a/problems/0209.长度最小的子数组.md +++ b/problems/0209.长度最小的子数组.md @@ -297,4 +297,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0213.打家劫舍II.md b/problems/0213.打家劫舍II.md index 332d3218..044769d5 100644 --- a/problems/0213.打家劫舍II.md +++ b/problems/0213.打家劫舍II.md @@ -174,4 +174,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0216.组合总和III.md b/problems/0216.组合总和III.md index d7ab6cf7..a6660d7a 100644 --- a/problems/0216.组合总和III.md +++ b/problems/0216.组合总和III.md @@ -454,4 +454,4 @@ int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0222.完全二叉树的节点个数.md b/problems/0222.完全二叉树的节点个数.md index 13017f7f..13f9f54d 100644 --- a/problems/0222.完全二叉树的节点个数.md +++ b/problems/0222.完全二叉树的节点个数.md @@ -455,4 +455,4 @@ var countNodes = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md index 8d4db953..3723f4a7 100644 --- a/problems/0225.用队列实现栈.md +++ b/problems/0225.用队列实现栈.md @@ -538,4 +538,4 @@ MyStack.prototype.empty = function() { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0226.翻转二叉树.md b/problems/0226.翻转二叉树.md index fb5d831a..157ee05c 100644 --- a/problems/0226.翻转二叉树.md +++ b/problems/0226.翻转二叉树.md @@ -569,4 +569,4 @@ var invertTree = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0232.用栈实现队列.md b/problems/0232.用栈实现队列.md index 9f6bb90f..ba12e0ab 100644 --- a/problems/0232.用栈实现队列.md +++ b/problems/0232.用栈实现队列.md @@ -356,4 +356,4 @@ MyQueue.prototype.empty = function() { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0234.回文链表.md b/problems/0234.回文链表.md index 631d2f6b..eada4474 100644 --- a/problems/0234.回文链表.md +++ b/problems/0234.回文链表.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 234.回文链表 [力扣题目链接](https://leetcode-cn.com/problems/palindrome-linked-list/) @@ -288,9 +288,9 @@ class Solution: ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0235.二叉搜索树的最近公共祖先.md b/problems/0235.二叉搜索树的最近公共祖先.md index a828096c..1d36ce37 100644 --- a/problems/0235.二叉搜索树的最近公共祖先.md +++ b/problems/0235.二叉搜索树的最近公共祖先.md @@ -357,4 +357,4 @@ var lowestCommonAncestor = function(root, p, q) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0236.二叉树的最近公共祖先.md b/problems/0236.二叉树的最近公共祖先.md index 46dcb545..215cb021 100644 --- a/problems/0236.二叉树的最近公共祖先.md +++ b/problems/0236.二叉树的最近公共祖先.md @@ -345,4 +345,4 @@ var lowestCommonAncestor = function(root, p, q) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0239.滑动窗口最大值.md b/problems/0239.滑动窗口最大值.md index a61e4ca8..48c65837 100644 --- a/problems/0239.滑动窗口最大值.md +++ b/problems/0239.滑动窗口最大值.md @@ -425,4 +425,4 @@ var maxSlidingWindow = function (nums, k) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0242.有效的字母异位词.md b/problems/0242.有效的字母异位词.md index 0828d360..c6981587 100644 --- a/problems/0242.有效的字母异位词.md +++ b/problems/0242.有效的字母异位词.md @@ -286,4 +286,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index e8a98527..7438f924 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -516,4 +516,4 @@ var binaryTreePaths = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0279.完全平方数.md b/problems/0279.完全平方数.md index 865669c2..ca7c4966 100644 --- a/problems/0279.完全平方数.md +++ b/problems/0279.完全平方数.md @@ -361,4 +361,4 @@ var numSquares2 = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0283.移动零.md b/problems/0283.移动零.md index 3909bcd5..18b29c3f 100644 --- a/problems/0283.移动零.md +++ b/problems/0283.移动零.md @@ -1,4 +1,3 @@ -

@@ -6,6 +5,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 动态规划:一样的套路,再求一次完全平方数 # 283. 移动零 @@ -96,9 +96,9 @@ Go: JavaScript: + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0300.最长上升子序列.md b/problems/0300.最长上升子序列.md index fdd5fda8..fe88ef26 100644 --- a/problems/0300.最长上升子序列.md +++ b/problems/0300.最长上升子序列.md @@ -202,4 +202,4 @@ const lengthOfLIS = (nums) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0309.最佳买卖股票时机含冷冻期.md b/problems/0309.最佳买卖股票时机含冷冻期.md index 1bb38568..47da9584 100644 --- a/problems/0309.最佳买卖股票时机含冷冻期.md +++ b/problems/0309.最佳买卖股票时机含冷冻期.md @@ -237,4 +237,4 @@ const maxProfit = (prices) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0322.零钱兑换.md b/problems/0322.零钱兑换.md index cdc5027c..8e03b391 100644 --- a/problems/0322.零钱兑换.md +++ b/problems/0322.零钱兑换.md @@ -330,4 +330,4 @@ const coinChange = (coins, amount) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index 13ad9e35..6f993e3e 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -450,4 +450,4 @@ var findItinerary = function(tickets) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0337.打家劫舍III.md b/problems/0337.打家劫舍III.md index dfb8ba57..f65bcdb6 100644 --- a/problems/0337.打家劫舍III.md +++ b/problems/0337.打家劫舍III.md @@ -402,4 +402,4 @@ const rob = root => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0343.整数拆分.md b/problems/0343.整数拆分.md index c11210fc..1f025051 100644 --- a/problems/0343.整数拆分.md +++ b/problems/0343.整数拆分.md @@ -276,4 +276,4 @@ var integerBreak = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0344.反转字符串.md b/problems/0344.反转字符串.md index a02c27d5..8dc0e082 100644 --- a/problems/0344.反转字符串.md +++ b/problems/0344.反转字符串.md @@ -233,4 +233,4 @@ func reverseString(_ s: inout [Character]) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0347.前K个高频元素.md b/problems/0347.前K个高频元素.md index 6012e118..315c184b 100644 --- a/problems/0347.前K个高频元素.md +++ b/problems/0347.前K个高频元素.md @@ -364,4 +364,4 @@ PriorityQueue.prototype.compare = function(index1, index2) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 203d9b6f..8c170ed9 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -266,4 +266,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index 75965c37..74a75ef1 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -192,4 +192,4 @@ var wiggleMaxLength = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0377.组合总和Ⅳ.md b/problems/0377.组合总和Ⅳ.md index 01f48d45..81e9dee3 100644 --- a/problems/0377.组合总和Ⅳ.md +++ b/problems/0377.组合总和Ⅳ.md @@ -246,4 +246,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md index 75b31698..ac851fcd 100644 --- a/problems/0383.赎金信.md +++ b/problems/0383.赎金信.md @@ -342,4 +342,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0392.判断子序列.md b/problems/0392.判断子序列.md index 784e3bbc..43cfbe7e 100644 --- a/problems/0392.判断子序列.md +++ b/problems/0392.判断子序列.md @@ -231,4 +231,4 @@ func isSubsequence(s string, t string) bool { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index c0eb7c8e..1fac7c9b 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -382,4 +382,4 @@ var sumOfLeftLeaves = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md index 3c6ee63c..91e10cd5 100644 --- a/problems/0406.根据身高重建队列.md +++ b/problems/0406.根据身高重建队列.md @@ -297,4 +297,4 @@ var reconstructQueue = function(people) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index 415ff88b..60695d1e 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -293,4 +293,4 @@ var canPartition = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index 4e850114..282404d8 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -319,4 +319,4 @@ var eraseOverlapIntervals = function(intervals) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index f5133b84..6fa7fa2d 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -491,4 +491,4 @@ var deleteNode = function (root, key) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0452.用最少数量的箭引爆气球.md b/problems/0452.用最少数量的箭引爆气球.md index 07141558..75ad01e8 100644 --- a/problems/0452.用最少数量的箭引爆气球.md +++ b/problems/0452.用最少数量的箭引爆气球.md @@ -247,4 +247,4 @@ int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0454.四数相加II.md b/problems/0454.四数相加II.md index 43b4070f..4f030268 100644 --- a/problems/0454.四数相加II.md +++ b/problems/0454.四数相加II.md @@ -286,4 +286,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0455.分发饼干.md b/problems/0455.分发饼干.md index bae1566c..41f04600 100644 --- a/problems/0455.分发饼干.md +++ b/problems/0455.分发饼干.md @@ -245,4 +245,4 @@ int findContentChildren(int* g, int gSize, int* s, int sSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index 7d8a7286..6d9b8d9f 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -369,4 +369,4 @@ var repeatedSubstringPattern = function (s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0463.岛屿的周长.md b/problems/0463.岛屿的周长.md index fd9585d2..511f85d9 100644 --- a/problems/0463.岛屿的周长.md +++ b/problems/0463.岛屿的周长.md @@ -1,3 +1,10 @@ +

+ + + + +

+

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 463. 岛屿的周长 [力扣题目链接](https://leetcode-cn.com/problems/island-perimeter/) @@ -126,4 +133,4 @@ JavaScript: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0474.一和零.md b/problems/0474.一和零.md index 5544c3c9..108a5ee3 100644 --- a/problems/0474.一和零.md +++ b/problems/0474.一和零.md @@ -331,4 +331,4 @@ const findMaxForm = (strs, m, n) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0491.递增子序列.md b/problems/0491.递增子序列.md index d3dc3472..63a2b8d5 100644 --- a/problems/0491.递增子序列.md +++ b/problems/0491.递增子序列.md @@ -320,4 +320,4 @@ var findSubsequences = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index c24ce6f9..a2388edf 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -392,4 +392,4 @@ const findTargetSumWays = (nums, target) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0496.下一个更大元素I.md b/problems/0496.下一个更大元素I.md index 45824d82..d7fd1d94 100644 --- a/problems/0496.下一个更大元素I.md +++ b/problems/0496.下一个更大元素I.md @@ -1,3 +1,10 @@ +

+ + + + +

+

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 496.下一个更大元素 I @@ -294,4 +301,8 @@ var nextGreaterElement = function (nums1, nums2) { }; ``` -
+----------------------- +* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) +* B站视频:[代码随想录](https://space.bilibili.com/525438321) +* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +
diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md index 22d4f4ac..1d24367e 100644 --- a/problems/0501.二叉搜索树中的众数.md +++ b/problems/0501.二叉搜索树中的众数.md @@ -690,4 +690,4 @@ var findMode = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0503.下一个更大元素II.md b/problems/0503.下一个更大元素II.md index 624c6c7c..13adc024 100644 --- a/problems/0503.下一个更大元素II.md +++ b/problems/0503.下一个更大元素II.md @@ -1,3 +1,10 @@ +

+ + + + +

+

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 503.下一个更大元素II @@ -178,4 +185,8 @@ var nextGreaterElements = function (nums) { return res; }; ``` -
+----------------------- +* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) +* B站视频:[代码随想录](https://space.bilibili.com/525438321) +* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +
diff --git a/problems/0509.斐波那契数.md b/problems/0509.斐波那契数.md index 7e4df26c..86591157 100644 --- a/problems/0509.斐波那契数.md +++ b/problems/0509.斐波那契数.md @@ -238,4 +238,4 @@ var fib = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0513.找树左下角的值.md b/problems/0513.找树左下角的值.md index d2c05fd8..ef44f700 100644 --- a/problems/0513.找树左下角的值.md +++ b/problems/0513.找树左下角的值.md @@ -441,4 +441,4 @@ var findBottomLeftValue = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0516.最长回文子序列.md b/problems/0516.最长回文子序列.md index 89b5667f..629e9247 100644 --- a/problems/0516.最长回文子序列.md +++ b/problems/0516.最长回文子序列.md @@ -243,4 +243,4 @@ const longestPalindromeSubseq = (s) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0518.零钱兑换II.md b/problems/0518.零钱兑换II.md index 6eb31cd8..44c00131 100644 --- a/problems/0518.零钱兑换II.md +++ b/problems/0518.零钱兑换II.md @@ -266,4 +266,4 @@ const change = (amount, coins) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0530.二叉搜索树的最小绝对差.md b/problems/0530.二叉搜索树的最小绝对差.md index b19a0dd2..e4467178 100644 --- a/problems/0530.二叉搜索树的最小绝对差.md +++ b/problems/0530.二叉搜索树的最小绝对差.md @@ -370,4 +370,4 @@ var getMinimumDifference = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0538.把二叉搜索树转换为累加树.md b/problems/0538.把二叉搜索树转换为累加树.md index 24fc7211..baeb300f 100644 --- a/problems/0538.把二叉搜索树转换为累加树.md +++ b/problems/0538.把二叉搜索树转换为累加树.md @@ -277,4 +277,4 @@ var convertBST = function (root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0541.反转字符串II.md b/problems/0541.反转字符串II.md index df2fade8..e6939c89 100644 --- a/problems/0541.反转字符串II.md +++ b/problems/0541.反转字符串II.md @@ -282,4 +282,4 @@ func reverseStr(_ s: String, _ k: Int) -> String { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0583.两个字符串的删除操作.md b/problems/0583.两个字符串的删除操作.md index 079b2028..4935d10c 100644 --- a/problems/0583.两个字符串的删除操作.md +++ b/problems/0583.两个字符串的删除操作.md @@ -211,4 +211,4 @@ const minDistance = (word1, word2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0617.合并二叉树.md b/problems/0617.合并二叉树.md index e21efcb3..71e2dbb2 100644 --- a/problems/0617.合并二叉树.md +++ b/problems/0617.合并二叉树.md @@ -541,4 +541,4 @@ var mergeTrees = function (root1, root2) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0647.回文子串.md b/problems/0647.回文子串.md index 7b90ca0c..f2d0e7e5 100644 --- a/problems/0647.回文子串.md +++ b/problems/0647.回文子串.md @@ -412,4 +412,4 @@ const countSubstrings = (s) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0649.Dota2参议院.md b/problems/0649.Dota2参议院.md index e2900824..b324df04 100644 --- a/problems/0649.Dota2参议院.md +++ b/problems/0649.Dota2参议院.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 649. Dota2 参议院 [力扣题目链接](https://leetcode-cn.com/problems/dota2-senate/) @@ -221,9 +221,9 @@ func predictPartyVictory(senateStr string) string { ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0654.最大二叉树.md b/problems/0654.最大二叉树.md index b644a0a3..aa84c8a6 100644 --- a/problems/0654.最大二叉树.md +++ b/problems/0654.最大二叉树.md @@ -362,4 +362,4 @@ var constructMaximumBinaryTree = function (nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0657.机器人能否返回原点.md b/problems/0657.机器人能否返回原点.md index ffa5d6f2..4e48698e 100644 --- a/problems/0657.机器人能否返回原点.md +++ b/problems/0657.机器人能否返回原点.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 657. 机器人能否返回原点 [力扣题目链接](https://leetcode-cn.com/problems/robot-return-to-origin/) @@ -151,9 +151,9 @@ var judgeCircle = function(moves) { }; ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0669.修剪二叉搜索树.md b/problems/0669.修剪二叉搜索树.md index ef6a3e00..ffb00b78 100644 --- a/problems/0669.修剪二叉搜索树.md +++ b/problems/0669.修剪二叉搜索树.md @@ -395,4 +395,4 @@ var trimBST = function (root,low,high) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0673.最长递增子序列的个数.md b/problems/0673.最长递增子序列的个数.md index 653edadf..d18ef2e6 100644 --- a/problems/0673.最长递增子序列的个数.md +++ b/problems/0673.最长递增子序列的个数.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 673.最长递增子序列的个数 @@ -339,9 +339,9 @@ func findNumberOfLIS(nums []int) int { ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0674.最长连续递增序列.md b/problems/0674.最长连续递增序列.md index 3f3b5e6f..383f770e 100644 --- a/problems/0674.最长连续递增序列.md +++ b/problems/0674.最长连续递增序列.md @@ -268,4 +268,4 @@ const findLengthOfLCIS = (nums) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0684.冗余连接.md b/problems/0684.冗余连接.md index bfbdeba9..a0155c18 100644 --- a/problems/0684.冗余连接.md +++ b/problems/0684.冗余连接.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 684.冗余连接 @@ -305,15 +305,15 @@ func findRedundantConnection(edges [][]int) []int { ```js ``` + + + + + + + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - - - - - - - -
+
diff --git a/problems/0685.冗余连接II.md b/problems/0685.冗余连接II.md index 404813f3..1f01794d 100644 --- a/problems/0685.冗余连接II.md +++ b/problems/0685.冗余连接II.md @@ -1,5 +1,3 @@ - -

@@ -517,10 +515,10 @@ func findRedundantDirectedConnection(edges [][]int) []int { ```js ``` + + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - - -

+
diff --git a/problems/0700.二叉搜索树中的搜索.md b/problems/0700.二叉搜索树中的搜索.md index c25ea12f..e4227eb1 100644 --- a/problems/0700.二叉搜索树中的搜索.md +++ b/problems/0700.二叉搜索树中的搜索.md @@ -342,4 +342,4 @@ var searchBST = function (root, val) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0701.二叉搜索树中的插入操作.md b/problems/0701.二叉搜索树中的插入操作.md index d5b9eb3f..33e9999c 100644 --- a/problems/0701.二叉搜索树中的插入操作.md +++ b/problems/0701.二叉搜索树中的插入操作.md @@ -492,4 +492,4 @@ var insertIntoBST = function (root, val) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index 67809000..dc9f2e74 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -529,4 +529,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md index e05165a9..077b0e87 100644 --- a/problems/0707.设计链表.md +++ b/problems/0707.设计链表.md @@ -1037,4 +1037,4 @@ class MyLinkedList { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md index 4ac4684e..cdedd506 100644 --- a/problems/0714.买卖股票的最佳时机含手续费.md +++ b/problems/0714.买卖股票的最佳时机含手续费.md @@ -269,4 +269,4 @@ var maxProfit = function(prices, fee) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0714.买卖股票的最佳时机含手续费(动态规划).md b/problems/0714.买卖股票的最佳时机含手续费(动态规划).md index 7c54a2fe..d1dfeb91 100644 --- a/problems/0714.买卖股票的最佳时机含手续费(动态规划).md +++ b/problems/0714.买卖股票的最佳时机含手续费(动态规划).md @@ -190,4 +190,4 @@ const maxProfit = (prices,fee) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0718.最长重复子数组.md b/problems/0718.最长重复子数组.md index 712b5eeb..d3488a06 100644 --- a/problems/0718.最长重复子数组.md +++ b/problems/0718.最长重复子数组.md @@ -304,4 +304,4 @@ const findLength = (nums1, nums2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0724.寻找数组的中心索引.md b/problems/0724.寻找数组的中心索引.md index 991ce647..7aef5094 100644 --- a/problems/0724.寻找数组的中心索引.md +++ b/problems/0724.寻找数组的中心索引.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 724.寻找数组的中心下标 [力扣题目链接](https://leetcode-cn.com/problems/find-pivot-index/) @@ -131,9 +131,9 @@ func pivotIndex(nums []int) int { ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md index f63a05b8..70c571db 100644 --- a/problems/0738.单调递增的数字.md +++ b/problems/0738.单调递增的数字.md @@ -209,4 +209,4 @@ var monotoneIncreasingDigits = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md index 53ce1133..5e570307 100644 --- a/problems/0739.每日温度.md +++ b/problems/0739.每日温度.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 739. 每日温度 [力扣题目链接](https://leetcode-cn.com/problems/daily-temperatures/) @@ -308,9 +308,9 @@ var dailyTemperatures = function(temperatures) { + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0746.使用最小花费爬楼梯.md b/problems/0746.使用最小花费爬楼梯.md index eb2a437a..9e1a430e 100644 --- a/problems/0746.使用最小花费爬楼梯.md +++ b/problems/0746.使用最小花费爬楼梯.md @@ -272,4 +272,4 @@ var minCostClimbingStairs = function(cost) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md index 43c663c2..bb327db2 100644 --- a/problems/0763.划分字母区间.md +++ b/problems/0763.划分字母区间.md @@ -181,4 +181,4 @@ var partitionLabels = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md index d281dc5a..668191b4 100644 --- a/problems/0841.钥匙和房间.md +++ b/problems/0841.钥匙和房间.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 841.钥匙和房间 [力扣题目链接](https://leetcode-cn.com/problems/keys-and-rooms/) @@ -221,9 +221,9 @@ func canVisitAllRooms(rooms [][]int) bool { JavaScript: + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md index 74455ace..ae21404e 100644 --- a/problems/0844.比较含退格的字符串.md +++ b/problems/0844.比较含退格的字符串.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 844.比较含退格的字符串 [力扣题目链接](https://leetcode-cn.com/problems/backspace-string-compare/) @@ -233,9 +233,9 @@ func backspaceCompare(s string, t string) bool { JavaScript: + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0860.柠檬水找零.md b/problems/0860.柠檬水找零.md index 46e05419..91a1450d 100644 --- a/problems/0860.柠檬水找零.md +++ b/problems/0860.柠檬水找零.md @@ -260,4 +260,4 @@ var lemonadeChange = function(bills) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0922.按奇偶排序数组II.md b/problems/0922.按奇偶排序数组II.md index 5b66247e..beb063b0 100644 --- a/problems/0922.按奇偶排序数组II.md +++ b/problems/0922.按奇偶排序数组II.md @@ -1,4 +1,3 @@ -

@@ -9,6 +8,7 @@ + # 922. 按奇偶排序数组II [力扣题目链接](https://leetcode-cn.com/problems/sort-array-by-parity-ii/) @@ -211,9 +211,9 @@ func sortArrayByParityII(nums []int) []int { ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -

+
diff --git a/problems/0925.长按键入.md b/problems/0925.长按键入.md index 70597508..0a10c1b3 100644 --- a/problems/0925.长按键入.md +++ b/problems/0925.长按键入.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 925.长按键入 [力扣题目链接](https://leetcode-cn.com/problems/long-pressed-name/) @@ -183,9 +183,9 @@ func isLongPressedName(name string, typed string) bool { JavaScript: + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/0941.有效的山脉数组.md b/problems/0941.有效的山脉数组.md index c4c8ebfa..14c13edd 100644 --- a/problems/0941.有效的山脉数组.md +++ b/problems/0941.有效的山脉数组.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 941.有效的山脉数组 [力扣题目链接](https://leetcode-cn.com/problems/valid-mountain-array/) @@ -156,11 +156,11 @@ func validMountainArray(arr []int) bool { ```js ``` + + + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - - - -
+
diff --git a/problems/0968.监控二叉树.md b/problems/0968.监控二叉树.md index 384c9a78..579b38ab 100644 --- a/problems/0968.监控二叉树.md +++ b/problems/0968.监控二叉树.md @@ -510,4 +510,4 @@ int minCameraCover(struct TreeNode* root){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0977.有序数组的平方.md b/problems/0977.有序数组的平方.md index a57af3c1..12b413e1 100644 --- a/problems/0977.有序数组的平方.md +++ b/problems/0977.有序数组的平方.md @@ -339,4 +339,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1002.查找常用字符.md b/problems/1002.查找常用字符.md index e02780da..7a9677ad 100644 --- a/problems/1002.查找常用字符.md +++ b/problems/1002.查找常用字符.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 1002. 查找常用字符 [力扣题目链接](https://leetcode-cn.com/problems/find-common-characters/) @@ -333,4 +333,4 @@ func commonChars(_ words: [String]) -> [String] { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1005.K次取反后最大化的数组和.md b/problems/1005.K次取反后最大化的数组和.md index 020476a9..1d552590 100644 --- a/problems/1005.K次取反后最大化的数组和.md +++ b/problems/1005.K次取反后最大化的数组和.md @@ -217,4 +217,4 @@ var largestSumAfterKNegations = function(nums, k) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1035.不相交的线.md b/problems/1035.不相交的线.md index a10fd381..04f8de09 100644 --- a/problems/1035.不相交的线.md +++ b/problems/1035.不相交的线.md @@ -139,4 +139,4 @@ const maxUncrossedLines = (nums1, nums2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1047.删除字符串中的所有相邻重复项.md b/problems/1047.删除字符串中的所有相邻重复项.md index b88fd618..420b64df 100644 --- a/problems/1047.删除字符串中的所有相邻重复项.md +++ b/problems/1047.删除字符串中的所有相邻重复项.md @@ -275,4 +275,4 @@ var removeDuplicates = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1049.最后一块石头的重量II.md b/problems/1049.最后一块石头的重量II.md index 795d923c..390e8c70 100644 --- a/problems/1049.最后一块石头的重量II.md +++ b/problems/1049.最后一块石头的重量II.md @@ -246,4 +246,4 @@ var lastStoneWeightII = function (stones) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1143.最长公共子序列.md b/problems/1143.最长公共子序列.md index b3b5e6c0..005d333a 100644 --- a/problems/1143.最长公共子序列.md +++ b/problems/1143.最长公共子序列.md @@ -221,4 +221,4 @@ const longestCommonSubsequence = (text1, text2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1207.独一无二的出现次数.md b/problems/1207.独一无二的出现次数.md index 027c9f5a..5b622546 100644 --- a/problems/1207.独一无二的出现次数.md +++ b/problems/1207.独一无二的出现次数.md @@ -119,9 +119,9 @@ Go: JavaScript: + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/1221.分割平衡字符串.md b/problems/1221.分割平衡字符串.md index c764e3ff..e5652623 100644 --- a/problems/1221.分割平衡字符串.md +++ b/problems/1221.分割平衡字符串.md @@ -110,9 +110,9 @@ public: ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/1356.根据数字二进制下1的数目排序.md b/problems/1356.根据数字二进制下1的数目排序.md index 06c29500..3c87b10d 100644 --- a/problems/1356.根据数字二进制下1的数目排序.md +++ b/problems/1356.根据数字二进制下1的数目排序.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 1356. 根据数字二进制下 1 的数目排序 [力扣题目链接](https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/) @@ -168,9 +168,9 @@ class Solution { ```js ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/1365.有多少小于当前数字的数字.md b/problems/1365.有多少小于当前数字的数字.md index 5cf6b2d8..4c0b4d58 100644 --- a/problems/1365.有多少小于当前数字的数字.md +++ b/problems/1365.有多少小于当前数字的数字.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 1365.有多少小于当前数字的数字 [力扣题目链接](https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/) @@ -162,4 +162,4 @@ JavaScript: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1382.将二叉搜索树变平衡.md b/problems/1382.将二叉搜索树变平衡.md index bce58c33..c1a8f69e 100644 --- a/problems/1382.将二叉搜索树变平衡.md +++ b/problems/1382.将二叉搜索树变平衡.md @@ -1,4 +1,3 @@ -

@@ -7,6 +6,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 1382.将二叉搜索树变平衡 [力扣题目链接](https://leetcode-cn.com/problems/balance-a-binary-search-tree/) @@ -127,10 +127,10 @@ Go: JavaScript: + + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - - -
+
diff --git a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md index 6897c01f..e7a316fb 100644 --- a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md +++ b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md @@ -235,4 +235,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md b/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md index 2eb253ba..08841565 100644 --- a/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md +++ b/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md @@ -207,4 +207,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树中递归带着回溯.md b/problems/二叉树中递归带着回溯.md index 7b0ccad7..e097a2dd 100644 --- a/problems/二叉树中递归带着回溯.md +++ b/problems/二叉树中递归带着回溯.md @@ -448,4 +448,4 @@ func traversal(root *TreeNode,result *[]string,path *[]int){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树总结篇.md b/problems/二叉树总结篇.md index ee046366..9563acf6 100644 --- a/problems/二叉树总结篇.md +++ b/problems/二叉树总结篇.md @@ -175,4 +175,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树理论基础.md b/problems/二叉树理论基础.md index b25f3be1..c7b316b3 100644 --- a/problems/二叉树理论基础.md +++ b/problems/二叉树理论基础.md @@ -234,4 +234,4 @@ function TreeNode(val, left, right) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树的统一迭代法.md b/problems/二叉树的统一迭代法.md index d8299e10..3fa73851 100644 --- a/problems/二叉树的统一迭代法.md +++ b/problems/二叉树的统一迭代法.md @@ -530,4 +530,4 @@ var postorderTraversal = function(root, res = []) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树的迭代遍历.md b/problems/二叉树的迭代遍历.md index 84363610..ae0bc98d 100644 --- a/problems/二叉树的迭代遍历.md +++ b/problems/二叉树的迭代遍历.md @@ -473,4 +473,4 @@ var postorderTraversal = function(root, res = []) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index 93f4000e..06d0d39e 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -415,4 +415,4 @@ int* postorderTraversal(struct TreeNode* root, int* returnSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/关于时间复杂度,你不知道的都在这里!.md b/problems/关于时间复杂度,你不知道的都在这里!.md index 7ff9b470..94f4bd1d 100644 --- a/problems/关于时间复杂度,你不知道的都在这里!.md +++ b/problems/关于时间复杂度,你不知道的都在这里!.md @@ -177,4 +177,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/剑指Offer05.替换空格.md b/problems/剑指Offer05.替换空格.md index 47907319..86d6baf8 100644 --- a/problems/剑指Offer05.替换空格.md +++ b/problems/剑指Offer05.替换空格.md @@ -313,4 +313,4 @@ func replaceSpace(_ s: String) -> String { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md index d8aaca67..3767c6dd 100644 --- a/problems/剑指Offer58-II.左旋转字符串.md +++ b/problems/剑指Offer58-II.左旋转字符串.md @@ -249,4 +249,4 @@ func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/动态规划-股票问题总结篇.md b/problems/动态规划-股票问题总结篇.md index a3443ecb..b2a3e8da 100644 --- a/problems/动态规划-股票问题总结篇.md +++ b/problems/动态规划-股票问题总结篇.md @@ -486,4 +486,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/动态规划总结篇.md b/problems/动态规划总结篇.md index e7e57351..512fad08 100644 --- a/problems/动态规划总结篇.md +++ b/problems/动态规划总结篇.md @@ -1,4 +1,3 @@ -

@@ -8,6 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ 如今动态规划已经讲解了42道经典题目,共50篇文章,是时候做一篇总结了。 关于动态规划,在专题第一篇[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)就说了动规五部曲,**而且强调了五部对解动规题目至关重要!** @@ -132,9 +132,9 @@ 最后感谢录友们的一路支持,Carl才有继续更下去的动力[玫瑰],[撒花] + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) - -
+
diff --git a/problems/动态规划理论基础.md b/problems/动态规划理论基础.md index bd46586f..7a7a304b 100644 --- a/problems/动态规划理论基础.md +++ b/problems/动态规划理论基础.md @@ -132,4 +132,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/双指针总结.md b/problems/双指针总结.md index 11d6ffa4..f5e7ba67 100644 --- a/problems/双指针总结.md +++ b/problems/双指针总结.md @@ -100,4 +100,4 @@ for (int i = 0; i < array.size(); i++) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/哈希表总结.md b/problems/哈希表总结.md index 58e386bc..71100bf6 100644 --- a/problems/哈希表总结.md +++ b/problems/哈希表总结.md @@ -131,4 +131,4 @@ std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层 * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/哈希表理论基础.md b/problems/哈希表理论基础.md index 2d3b03bd..331d26c8 100644 --- a/problems/哈希表理论基础.md +++ b/problems/哈希表理论基础.md @@ -133,4 +133,4 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/回溯总结.md b/problems/回溯总结.md index 5a9725dd..ebbcb073 100644 --- a/problems/回溯总结.md +++ b/problems/回溯总结.md @@ -454,4 +454,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/回溯算法去重问题的另一种写法.md b/problems/回溯算法去重问题的另一种写法.md index d267d23c..cfc8ad86 100644 --- a/problems/回溯算法去重问题的另一种写法.md +++ b/problems/回溯算法去重问题的另一种写法.md @@ -263,4 +263,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/回溯算法理论基础.md b/problems/回溯算法理论基础.md index c351ddba..286d0b77 100644 --- a/problems/回溯算法理论基础.md +++ b/problems/回溯算法理论基础.md @@ -175,4 +175,4 @@ void backtracking(参数) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/字符串总结.md b/problems/字符串总结.md index 57ac9a31..258ea0ef 100644 --- a/problems/字符串总结.md +++ b/problems/字符串总结.md @@ -130,4 +130,4 @@ KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易 * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md index 7fafb94b..0bf90c66 100644 --- a/problems/数组总结篇.md +++ b/problems/数组总结篇.md @@ -149,4 +149,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/数组理论基础.md b/problems/数组理论基础.md index 146cd2de..b53665ee 100644 --- a/problems/数组理论基础.md +++ b/problems/数组理论基础.md @@ -124,4 +124,4 @@ public static void test_arr() { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/栈与队列总结.md b/problems/栈与队列总结.md index ffcd38a1..db8e1296 100644 --- a/problems/栈与队列总结.md +++ b/problems/栈与队列总结.md @@ -181,4 +181,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/栈与队列理论基础.md b/problems/栈与队列理论基础.md index c43ce0f5..8c2effec 100644 --- a/problems/栈与队列理论基础.md +++ b/problems/栈与队列理论基础.md @@ -94,4 +94,4 @@ std::queue> third; // 定义以list为底层容器的队列 * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/根据身高重建队列(vector原理讲解).md b/problems/根据身高重建队列(vector原理讲解).md index dfc824fa..143ee01f 100644 --- a/problems/根据身高重建队列(vector原理讲解).md +++ b/problems/根据身高重建队列(vector原理讲解).md @@ -180,4 +180,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/算法模板.md b/problems/算法模板.md index b56678ab..0cf8431d 100644 --- a/problems/算法模板.md +++ b/problems/算法模板.md @@ -296,4 +296,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包总结篇.md b/problems/背包总结篇.md index f3732c8d..6086274e 100644 --- a/problems/背包总结篇.md +++ b/problems/背包总结篇.md @@ -101,4 +101,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index 030c00d2..b2cee391 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -431,4 +431,4 @@ test(); * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包理论基础01背包-2.md b/problems/背包理论基础01背包-2.md index 07f74186..ac551565 100644 --- a/problems/背包理论基础01背包-2.md +++ b/problems/背包理论基础01背包-2.md @@ -323,4 +323,4 @@ test(); * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包问题理论基础多重背包.md b/problems/背包问题理论基础多重背包.md index a2ef88a4..814c9711 100644 --- a/problems/背包问题理论基础多重背包.md +++ b/problems/背包问题理论基础多重背包.md @@ -209,4 +209,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md index 455a3c33..4f3ef9ba 100644 --- a/problems/背包问题理论基础完全背包.md +++ b/problems/背包问题理论基础完全背包.md @@ -349,4 +349,4 @@ function test_completePack2() { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/贪心算法总结篇.md b/problems/贪心算法总结篇.md index 94e292ba..a203494e 100644 --- a/problems/贪心算法总结篇.md +++ b/problems/贪心算法总结篇.md @@ -158,4 +158,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/贪心算法理论基础.md b/problems/贪心算法理论基础.md index 9c131709..495348d0 100644 --- a/problems/贪心算法理论基础.md +++ b/problems/贪心算法理论基础.md @@ -94,4 +94,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/链表总结篇.md b/problems/链表总结篇.md index fed8cb60..64a7b42a 100644 --- a/problems/链表总结篇.md +++ b/problems/链表总结篇.md @@ -98,4 +98,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/链表理论基础.md b/problems/链表理论基础.md index d210b6bd..7e0cd431 100644 --- a/problems/链表理论基础.md +++ b/problems/链表理论基础.md @@ -159,4 +159,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/面试题02.07.链表相交.md b/problems/面试题02.07.链表相交.md index d59256c6..d694899d 100644 --- a/problems/面试题02.07.链表相交.md +++ b/problems/面试题02.07.链表相交.md @@ -258,4 +258,4 @@ var getIntersectionNode = function(headA, headB) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
From eb87eb0b321e13619dd72f8a8de8f64fa96a7a8f Mon Sep 17 00:00:00 2001 From: baichangfu Date: Wed, 29 Sep 2021 11:19:48 +0800 Subject: [PATCH 146/222] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/数组总结篇.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md index 0bf90c66..528904c2 100644 --- a/problems/数组总结篇.md +++ b/problems/数组总结篇.md @@ -51,7 +51,7 @@ -所以**二维数据在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!** +所以**二维数据在内存中不是 `3*4` 的连续地址空间,而是三条连续的地址空间组成!** # 数组的经典题目 @@ -65,9 +65,9 @@ [数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0704.二分查找.html) -这道题目呢,考察的数据的基本操作,思路很简单,但是在通过率在简单题里并不高,不要轻敌。 +这道题目呢,考察数组的基本操作,思路很简单,但是通过率在简单题里并不高,不要轻敌。 -可以使用暴力解法,通过这道题目,如果准求更优的算法,建议试一试用二分法,来解决这道题目 +可以使用暴力解法,通过这道题目,如果追求更优的算法,建议试一试用二分法,来解决这道题目 暴力解法时间复杂度:O(n) 二分法时间复杂度:O(logn) @@ -86,10 +86,10 @@ 暴力解法时间复杂度:O(n^2) 双指针时间复杂度:O(n) -这道题目迷惑了不少同学,纠结于数组中的元素为什么不能删除,主要是因为一下两点: +这道题目迷惑了不少同学,纠结于数组中的元素为什么不能删除,主要是因为以下两点: * 数组在内存中是连续的地址空间,不能释放单一元素,如果要释放,就是全释放(程序运行结束,回收内存栈空间)。 -* C++中vector和array的区别一定要弄清楚,vector的底层实现是array,所以vector展现出友好的一些都是因为经过包装了。 +* C++中vector和array的区别一定要弄清楚,vector的底层实现是array,封装后使用更友好。 双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组和链表操作的面试题,都使用双指针法。 @@ -124,7 +124,7 @@ 从二分法到双指针,从滑动窗口到螺旋矩阵,相信如果大家真的认真做了「代码随想录」每日推荐的题目,定会有所收获。 -推荐的题目即使大家之前做过了,再读一遍的文章,也会帮助你提炼出解题的精髓所在。 +推荐的题目即使大家之前做过了,再读一遍文章,也会帮助你提炼出解题的精髓所在。 如果感觉有所收获,希望大家多多支持,打卡转发,点赞在看 都是对我最大的鼓励! From 5de0f0041f3367f7f7c5c8c6b8d57c39e7552617 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 29 Sep 2021 11:28:47 +0800 Subject: [PATCH 147/222] Update --- README.md | 1 + problems/0001.两数之和.md | 2 +- problems/0078.子集.md | 32 ++++++++++++++++---------------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index d1076aba..6a64da9f 100644 --- a/README.md +++ b/README.md @@ -458,6 +458,7 @@ * [724.寻找数组的中心索引](./problems/0724.寻找数组的中心索引.md) * [34.在排序数组中查找元素的第一个和最后一个位置](./problems/0034.在排序数组中查找元素的第一个和最后一个位置.md) (二分法) * [922.按奇偶排序数组II](./problems/0922.按奇偶排序数组II.md) +* [35.搜索插入位置](./problems/0035.搜索插入位置.md) ## 链表 diff --git a/problems/0001.两数之和.md b/problems/0001.两数之和.md index 0ef73c6a..949e52a7 100644 --- a/problems/0001.两数之和.md +++ b/problems/0001.两数之和.md @@ -253,4 +253,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0078.子集.md b/problems/0078.子集.md index 39f6ed5d..59f291d0 100644 --- a/problems/0078.子集.md +++ b/problems/0078.子集.md @@ -7,7 +7,7 @@

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 第78题. 子集 +# 78.子集 [力扣题目链接](https://leetcode-cn.com/problems/subsets/) @@ -29,7 +29,7 @@   [] ] -## 思路 +# 思路 求子集问题和[77.组合](https://programmercarl.com/0077.组合.html)和[131.分割回文串](https://programmercarl.com/0131.分割回文串.html)又不一样了。 @@ -153,19 +153,19 @@ public: 并不会,因为每次递归的下一层就是从i+1开始的。 -## 总结 +# 总结 相信大家经过了 * 组合问题: - * [回溯算法:求组合问题](https://programmercarl.com/0077.组合.html) + * [77.组合](https://programmercarl.com/0077.组合.html) * [回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html) - * [回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html) - * [回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html) - * [回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html) - * [回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html) + * [216.组合总和III](https://programmercarl.com/0216.组合总和III.html) + * [17.电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html) + * [39.组合总和](https://programmercarl.com/0039.组合总和.html) + * [40.组合总和II](https://programmercarl.com/0040.组合总和II.html) * 分割问题: - * [回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html) - * [回溯算法:复原IP地址](https://programmercarl.com/0093.复原IP地址.html) + * [131.分割回文串](https://programmercarl.com/0131.分割回文串.html) + * [93.复原IP地址](https://programmercarl.com/0093.复原IP地址.html) 洗礼之后,发现子集问题还真的有点简单了,其实这就是一道标准的模板题。 @@ -173,10 +173,10 @@ public: **而组合问题、分割问题是收集树形结构中叶子节点的结果**。 -## 其他语言版本 +# 其他语言版本 -Java: +## Java ```java class Solution { List> result = new ArrayList<>();// 存放符合条件结果的集合 @@ -204,7 +204,7 @@ class Solution { } ``` -Python: +## Python ```python3 class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: @@ -220,7 +220,7 @@ class Solution: return res ``` -Go: +## Go ```Go var res [][]int func subset(nums []int) [][]int { @@ -244,7 +244,7 @@ func Dfs(temp, nums []int, start int){ } ``` -Javascript: +## Javascript: ```Javascript var subsets = function(nums) { @@ -263,7 +263,7 @@ var subsets = function(nums) { }; ``` -C: +## C ```c int* path; int pathTop; From 947cc4fad89e94810136a96ab0bc9e20781e96eb Mon Sep 17 00:00:00 2001 From: baichangfu Date: Wed, 29 Sep 2021 11:47:15 +0800 Subject: [PATCH 148/222] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/链表理论基础.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/链表理论基础.md b/problems/链表理论基础.md index 7e0cd431..c62e4b82 100644 --- a/problems/链表理论基础.md +++ b/problems/链表理论基础.md @@ -9,9 +9,9 @@ # 关于链表,你该了解这些! -什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点是又两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 +什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 -链接的入口点称为列表的头结点也就是head。 +链接的入口节点称为链表的头结点也就是head。 如图所示: ![链表1](https://img-blog.csdnimg.cn/20200806194529815.png) From 33768a0ffbee5195832b1e09252e941d51aea3f0 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 29 Sep 2021 11:48:39 +0800 Subject: [PATCH 149/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0005.最长回文子串.md | 2 +- problems/0015.三数之和.md | 2 +- problems/0017.电话号码的字母组合.md | 2 +- problems/0018.四数之和.md | 2 +- problems/0019.删除链表的倒数第N个节点.md | 2 +- problems/0020.有效的括号.md | 2 +- problems/0024.两两交换链表中的节点.md | 2 +- problems/0027.移除元素.md | 2 +- problems/0028.实现strStr.md | 2 +- problems/0031.下一个排列.md | 2 +- ...序数组中查找元素的第一个和最后一个位置.md | 2 +- problems/0035.搜索插入位置.md | 2 +- problems/0037.解数独.md | 2 +- problems/0039.组合总和.md | 2 +- problems/0040.组合总和II.md | 2 +- problems/0042.接雨水.md | 2 +- problems/0045.跳跃游戏II.md | 2 +- problems/0046.全排列.md | 2 +- problems/0047.全排列II.md | 2 +- problems/0051.N皇后.md | 2 +- problems/0052.N皇后II.md | 2 +- problems/0053.最大子序和.md | 2 +- problems/0053.最大子序和(动态规划).md | 2 +- problems/0055.跳跃游戏.md | 2 +- problems/0056.合并区间.md | 2 +- problems/0059.螺旋矩阵II.md | 2 +- problems/0062.不同路径.md | 2 +- problems/0063.不同路径II.md | 2 +- problems/0070.爬楼梯.md | 2 +- problems/0070.爬楼梯完全背包版本.md | 2 +- problems/0072.编辑距离.md | 2 +- problems/0077.组合.md | 2 +- problems/0077.组合优化.md | 2 +- problems/0078.子集.md | 2 +- problems/0084.柱状图中最大的矩形.md | 2 +- problems/0090.子集II.md | 2 +- problems/0093.复原IP地址.md | 2 +- problems/0096.不同的二叉搜索树.md | 2 +- problems/0098.验证二叉搜索树.md | 2 +- problems/0100.相同的树.md | 2 +- problems/0101.对称二叉树.md | 2 +- problems/0102.二叉树的层序遍历.md | 2 +- problems/0104.二叉树的最大深度.md | 2 +- problems/0106.从中序与后序遍历序列构造二叉树.md | 2 +- problems/0108.将有序数组转换为二叉搜索树.md | 2 +- problems/0110.平衡二叉树.md | 2 +- problems/0111.二叉树的最小深度.md | 2 +- problems/0112.路径总和.md | 2 +- problems/0115.不同的子序列.md | 2 +- .../0116.填充每个节点的下一个右侧节点指针.md | 2 +- problems/0121.买卖股票的最佳时机.md | 2 +- problems/0122.买卖股票的最佳时机II.md | 2 +- .../0122.买卖股票的最佳时机II(动态规划).md | 2 +- problems/0123.买卖股票的最佳时机III.md | 2 +- problems/0127.单词接龙.md | 2 +- problems/0129.求根到叶子节点数字之和.md | 2 +- problems/0131.分割回文串.md | 2 +- problems/0132.分割回文串II.md | 2 +- problems/0134.加油站.md | 2 +- problems/0135.分发糖果.md | 2 +- problems/0139.单词拆分.md | 2 +- problems/0141.环形链表.md | 2 +- problems/0142.环形链表II.md | 2 +- problems/0143.重排链表.md | 2 +- problems/0150.逆波兰表达式求值.md | 2 +- problems/0151.翻转字符串里的单词.md | 2 +- problems/0160.相交链表.md | 2 +- problems/0188.买卖股票的最佳时机IV.md | 2 +- problems/0189.旋转数组.md | 2 +- problems/0198.打家劫舍.md | 2 +- problems/0202.快乐数.md | 2 +- problems/0203.移除链表元素.md | 2 +- problems/0205.同构字符串.md | 2 +- problems/0206.翻转链表.md | 2 +- problems/0209.长度最小的子数组.md | 2 +- problems/0213.打家劫舍II.md | 2 +- problems/0216.组合总和III.md | 2 +- problems/0222.完全二叉树的节点个数.md | 2 +- problems/0225.用队列实现栈.md | 2 +- problems/0226.翻转二叉树.md | 2 +- problems/0232.用栈实现队列.md | 2 +- problems/0234.回文链表.md | 2 +- problems/0235.二叉搜索树的最近公共祖先.md | 2 +- problems/0236.二叉树的最近公共祖先.md | 2 +- problems/0239.滑动窗口最大值.md | 2 +- problems/0242.有效的字母异位词.md | 2 +- problems/0257.二叉树的所有路径.md | 2 +- problems/0279.完全平方数.md | 2 +- problems/0283.移动零.md | 2 +- problems/0300.最长上升子序列.md | 2 +- problems/0309.最佳买卖股票时机含冷冻期.md | 2 +- problems/0322.零钱兑换.md | 2 +- problems/0332.重新安排行程.md | 2 +- problems/0337.打家劫舍III.md | 2 +- problems/0343.整数拆分.md | 2 +- problems/0344.反转字符串.md | 2 +- problems/0347.前K个高频元素.md | 2 +- problems/0349.两个数组的交集.md | 2 +- problems/0376.摆动序列.md | 2 +- problems/0377.组合总和Ⅳ.md | 2 +- problems/0383.赎金信.md | 2 +- problems/0392.判断子序列.md | 2 +- problems/0404.左叶子之和.md | 2 +- problems/0406.根据身高重建队列.md | 2 +- problems/0416.分割等和子集.md | 2 +- problems/0435.无重叠区间.md | 2 +- problems/0450.删除二叉搜索树中的节点.md | 2 +- problems/0452.用最少数量的箭引爆气球.md | 2 +- problems/0454.四数相加II.md | 2 +- problems/0455.分发饼干.md | 2 +- problems/0459.重复的子字符串.md | 2 +- problems/0463.岛屿的周长.md | 2 +- problems/0474.一和零.md | 2 +- problems/0491.递增子序列.md | 2 +- problems/0494.目标和.md | 2 +- problems/0496.下一个更大元素I.md | 2 +- problems/0501.二叉搜索树中的众数.md | 2 +- problems/0503.下一个更大元素II.md | 2 +- problems/0509.斐波那契数.md | 2 +- problems/0513.找树左下角的值.md | 2 +- problems/0516.最长回文子序列.md | 2 +- problems/0518.零钱兑换II.md | 2 +- problems/0530.二叉搜索树的最小绝对差.md | 2 +- problems/0538.把二叉搜索树转换为累加树.md | 2 +- problems/0541.反转字符串II.md | 2 +- problems/0583.两个字符串的删除操作.md | 2 +- problems/0617.合并二叉树.md | 2 +- problems/0647.回文子串.md | 2 +- problems/0649.Dota2参议院.md | 2 +- problems/0654.最大二叉树.md | 2 +- problems/0657.机器人能否返回原点.md | 2 +- problems/0669.修剪二叉搜索树.md | 2 +- problems/0673.最长递增子序列的个数.md | 2 +- problems/0674.最长连续递增序列.md | 2 +- problems/0684.冗余连接.md | 2 +- problems/0685.冗余连接II.md | 2 +- problems/0700.二叉搜索树中的搜索.md | 2 +- problems/0701.二叉搜索树中的插入操作.md | 2 +- problems/0704.二分查找.md | 2 +- problems/0707.设计链表.md | 2 +- problems/0714.买卖股票的最佳时机含手续费.md | 2 +- ...买卖股票的最佳时机含手续费(动态规划).md | 2 +- problems/0718.最长重复子数组.md | 2 +- problems/0724.寻找数组的中心索引.md | 2 +- problems/0738.单调递增的数字.md | 2 +- problems/0739.每日温度.md | 2 +- problems/0746.使用最小花费爬楼梯.md | 2 +- problems/0763.划分字母区间.md | 2 +- problems/0841.钥匙和房间.md | 2 +- problems/0844.比较含退格的字符串.md | 2 +- problems/0860.柠檬水找零.md | 2 +- problems/0922.按奇偶排序数组II.md | 2 +- problems/0925.长按键入.md | 2 +- problems/0941.有效的山脉数组.md | 2 +- problems/0968.监控二叉树.md | 2 +- problems/0977.有序数组的平方.md | 2 +- problems/1002.查找常用字符.md | 2 +- problems/1005.K次取反后最大化的数组和.md | 2 +- problems/1035.不相交的线.md | 2 +- problems/1047.删除字符串中的所有相邻重复项.md | 2 +- problems/1049.最后一块石头的重量II.md | 2 +- problems/1143.最长公共子序列.md | 2 +- problems/1207.独一无二的出现次数.md | 2 +- problems/1221.分割平衡字符串.md | 2 +- problems/1356.根据数字二进制下1的数目排序.md | 2 +- problems/1365.有多少小于当前数字的数字.md | 2 +- problems/1382.将二叉搜索树变平衡.md | 2 +- ...n)的算法居然超时了,此时的n究竟是多大?.md | 2 +- problems/为了绝杀编辑距离,卡尔做了三步铺垫.md | 2 +- problems/二叉树中递归带着回溯.md | 2 +- problems/二叉树总结篇.md | 2 +- problems/二叉树理论基础.md | 2 +- problems/二叉树的统一迭代法.md | 2 +- problems/二叉树的迭代遍历.md | 2 +- problems/二叉树的递归遍历.md | 2 +- .../关于时间复杂度,你不知道的都在这里!.md | 2 +- problems/剑指Offer05.替换空格.md | 2 +- problems/剑指Offer58-II.左旋转字符串.md | 2 +- problems/动态规划-股票问题总结篇.md | 2 +- problems/动态规划总结篇.md | 2 +- problems/动态规划理论基础.md | 2 +- problems/双指针总结.md | 2 +- problems/哈希表总结.md | 2 +- problems/哈希表理论基础.md | 2 +- problems/回溯总结.md | 2 +- problems/回溯算法去重问题的另一种写法.md | 2 +- problems/回溯算法理论基础.md | 2 +- problems/字符串总结.md | 2 +- problems/数组总结篇.md | 2 +- problems/数组理论基础.md | 2 +- problems/栈与队列总结.md | 2 +- problems/栈与队列理论基础.md | 2 +- problems/根据身高重建队列(vector原理讲解).md | 2 +- problems/算法模板.md | 2 +- problems/背包总结篇.md | 2 +- problems/背包理论基础01背包-1.md | 2 +- problems/背包理论基础01背包-2.md | 2 +- problems/背包问题理论基础多重背包.md | 2 +- problems/背包问题理论基础完全背包.md | 2 +- problems/贪心算法总结篇.md | 2 +- problems/贪心算法理论基础.md | 2 +- problems/链表总结篇.md | 2 +- problems/链表理论基础.md | 2 +- problems/面试题02.07.链表相交.md | 2 +- 204 files changed, 204 insertions(+), 204 deletions(-) diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md index 98df800a..82d9edae 100644 --- a/problems/0005.最长回文子串.md +++ b/problems/0005.最长回文子串.md @@ -443,4 +443,4 @@ var longestPalindrome = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index d00b76bd..5c9a240b 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -441,4 +441,4 @@ func threeSum(_ nums: [Int]) -> [[Int]] { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md index 3dff97e5..15a486f2 100644 --- a/problems/0017.电话号码的字母组合.md +++ b/problems/0017.电话号码的字母组合.md @@ -475,4 +475,4 @@ char ** letterCombinations(char * digits, int* returnSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index ddeb3c96..e1d0d03c 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -407,4 +407,4 @@ func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0019.删除链表的倒数第N个节点.md b/problems/0019.删除链表的倒数第N个节点.md index f54b1629..0e8aeaec 100644 --- a/problems/0019.删除链表的倒数第N个节点.md +++ b/problems/0019.删除链表的倒数第N个节点.md @@ -233,4 +233,4 @@ func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0020.有效的括号.md b/problems/0020.有效的括号.md index 918a3560..bf0884b3 100644 --- a/problems/0020.有效的括号.md +++ b/problems/0020.有效的括号.md @@ -290,4 +290,4 @@ var isValid = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0024.两两交换链表中的节点.md b/problems/0024.两两交换链表中的节点.md index 19c2a06e..11828ca0 100644 --- a/problems/0024.两两交换链表中的节点.md +++ b/problems/0024.两两交换链表中的节点.md @@ -283,4 +283,4 @@ func swapPairs(_ head: ListNode?) -> ListNode? { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index 21216945..842b3c78 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -290,4 +290,4 @@ int removeElement(int* nums, int numsSize, int val){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index 35bec96d..2a7b9cfa 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -902,4 +902,4 @@ var strStr = function (haystack, needle) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0031.下一个排列.md b/problems/0031.下一个排列.md index 6da71139..9efcb06a 100644 --- a/problems/0031.下一个排列.md +++ b/problems/0031.下一个排列.md @@ -185,4 +185,4 @@ var nextPermutation = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md index 22963b6f..d70dcba5 100644 --- a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md +++ b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md @@ -443,4 +443,4 @@ var searchRange = function(nums, target) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md index b25bfe54..593e3fe5 100644 --- a/problems/0035.搜索插入位置.md +++ b/problems/0035.搜索插入位置.md @@ -313,4 +313,4 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0037.解数独.md b/problems/0037.解数独.md index 468cd3a6..7bc07252 100644 --- a/problems/0037.解数独.md +++ b/problems/0037.解数独.md @@ -556,4 +556,4 @@ void solveSudoku(char** board, int boardSize, int* boardColSize) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index 369d1cb9..e6f65700 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -405,4 +405,4 @@ int** combinationSum(int* candidates, int candidatesSize, int target, int* retur * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index 6d0460eb..13e0b35f 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -458,4 +458,4 @@ int** combinationSum2(int* candidates, int candidatesSize, int target, int* retu * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index ae61fac9..f0d0ecb3 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -676,4 +676,4 @@ int trap(int* height, int heightSize) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0045.跳跃游戏II.md b/problems/0045.跳跃游戏II.md index 31b6ee2e..43c2f019 100644 --- a/problems/0045.跳跃游戏II.md +++ b/problems/0045.跳跃游戏II.md @@ -236,4 +236,4 @@ var jump = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0046.全排列.md b/problems/0046.全排列.md index bba7dd6a..487a07ad 100644 --- a/problems/0046.全排列.md +++ b/problems/0046.全排列.md @@ -315,4 +315,4 @@ var permute = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0047.全排列II.md b/problems/0047.全排列II.md index 085b686e..4c2c2758 100644 --- a/problems/0047.全排列II.md +++ b/problems/0047.全排列II.md @@ -338,4 +338,4 @@ func backTring(nums,subRes []int,res *[][]int,used []bool){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md index fa2d2ab7..7e2b202f 100644 --- a/problems/0051.N皇后.md +++ b/problems/0051.N皇后.md @@ -499,4 +499,4 @@ var solveNQueens = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0052.N皇后II.md b/problems/0052.N皇后II.md index 51cb5812..6d7a5bac 100644 --- a/problems/0052.N皇后II.md +++ b/problems/0052.N皇后II.md @@ -149,4 +149,4 @@ var totalNQueens = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index da67bfd7..75281210 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -216,4 +216,4 @@ var maxSubArray = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0053.最大子序和(动态规划).md b/problems/0053.最大子序和(动态规划).md index ebf4541c..2c3ccc15 100644 --- a/problems/0053.最大子序和(动态规划).md +++ b/problems/0053.最大子序和(动态规划).md @@ -192,4 +192,4 @@ const maxSubArray = nums => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0055.跳跃游戏.md b/problems/0055.跳跃游戏.md index 0c936131..816eb64b 100644 --- a/problems/0055.跳跃游戏.md +++ b/problems/0055.跳跃游戏.md @@ -161,4 +161,4 @@ var canJump = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0056.合并区间.md b/problems/0056.合并区间.md index 6332d5a9..93c0a2a0 100644 --- a/problems/0056.合并区间.md +++ b/problems/0056.合并区间.md @@ -248,4 +248,4 @@ var merge = function (intervals) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 99750f60..994bd839 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -542,4 +542,4 @@ int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0062.不同路径.md b/problems/0062.不同路径.md index 4d0381e0..af3a8f40 100644 --- a/problems/0062.不同路径.md +++ b/problems/0062.不同路径.md @@ -333,4 +333,4 @@ var uniquePaths = function(m, n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0063.不同路径II.md b/problems/0063.不同路径II.md index 322de75e..c2f8ec20 100644 --- a/problems/0063.不同路径II.md +++ b/problems/0063.不同路径II.md @@ -341,4 +341,4 @@ var uniquePathsWithObstacles = function(obstacleGrid) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0070.爬楼梯.md b/problems/0070.爬楼梯.md index 54d026ab..97926e7a 100644 --- a/problems/0070.爬楼梯.md +++ b/problems/0070.爬楼梯.md @@ -301,4 +301,4 @@ var climbStairs = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0070.爬楼梯完全背包版本.md b/problems/0070.爬楼梯完全背包版本.md index 6ef694f8..104b2d5a 100644 --- a/problems/0070.爬楼梯完全背包版本.md +++ b/problems/0070.爬楼梯完全背包版本.md @@ -206,4 +206,4 @@ var climbStairs = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0072.编辑距离.md b/problems/0072.编辑距离.md index ca8e85b8..8096c0ad 100644 --- a/problems/0072.编辑距离.md +++ b/problems/0072.编辑距离.md @@ -333,4 +333,4 @@ const minDistance = (word1, word2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0077.组合.md b/problems/0077.组合.md index 6f6f89a6..ee2a4cb6 100644 --- a/problems/0077.组合.md +++ b/problems/0077.组合.md @@ -627,4 +627,4 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0077.组合优化.md b/problems/0077.组合优化.md index 02b30d3d..3282d790 100644 --- a/problems/0077.组合优化.md +++ b/problems/0077.组合优化.md @@ -300,4 +300,4 @@ int** combine(int n, int k, int* returnSize, int** returnColumnSizes){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0078.子集.md b/problems/0078.子集.md index 59f291d0..878133a1 100644 --- a/problems/0078.子集.md +++ b/problems/0078.子集.md @@ -325,4 +325,4 @@ int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0084.柱状图中最大的矩形.md b/problems/0084.柱状图中最大的矩形.md index 9c7035f2..ccb59fbe 100644 --- a/problems/0084.柱状图中最大的矩形.md +++ b/problems/0084.柱状图中最大的矩形.md @@ -407,4 +407,4 @@ var largestRectangleArea = function(heights) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index d2a9279f..7ae7c6c2 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -353,4 +353,4 @@ int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColum * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 26103318..4e56ddc4 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -524,4 +524,4 @@ char ** restoreIpAddresses(char * s, int* returnSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0096.不同的二叉搜索树.md b/problems/0096.不同的二叉搜索树.md index 76d7d353..38a4ad88 100644 --- a/problems/0096.不同的二叉搜索树.md +++ b/problems/0096.不同的二叉搜索树.md @@ -234,4 +234,4 @@ const numTrees =(n) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0098.验证二叉搜索树.md b/problems/0098.验证二叉搜索树.md index c7e5b4e6..fcd92862 100644 --- a/problems/0098.验证二叉搜索树.md +++ b/problems/0098.验证二叉搜索树.md @@ -529,4 +529,4 @@ var isValidBST = function (root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0100.相同的树.md b/problems/0100.相同的树.md index c7431c5e..f5672b72 100644 --- a/problems/0100.相同的树.md +++ b/problems/0100.相同的树.md @@ -247,4 +247,4 @@ JavaScript: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0101.对称二叉树.md b/problems/0101.对称二叉树.md index 196e0b58..fe3321ec 100644 --- a/problems/0101.对称二叉树.md +++ b/problems/0101.对称二叉树.md @@ -582,4 +582,4 @@ var isSymmetric = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index da4398f5..37f4f526 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1906,4 +1906,4 @@ var minDepth = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0104.二叉树的最大深度.md b/problems/0104.二叉树的最大深度.md index 4162de80..e20f147f 100644 --- a/problems/0104.二叉树的最大深度.md +++ b/problems/0104.二叉树的最大深度.md @@ -586,4 +586,4 @@ var maxDepth = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 68f4419a..a83341fd 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -823,4 +823,4 @@ var buildTree = function(preorder, inorder) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0108.将有序数组转换为二叉搜索树.md b/problems/0108.将有序数组转换为二叉搜索树.md index 9b260db1..f2bfbb3b 100644 --- a/problems/0108.将有序数组转换为二叉搜索树.md +++ b/problems/0108.将有序数组转换为二叉搜索树.md @@ -362,4 +362,4 @@ var sortedArrayToBST = function (nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index bd2fe432..7858fa60 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -624,4 +624,4 @@ var isBalanced = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0111.二叉树的最小深度.md b/problems/0111.二叉树的最小深度.md index 3cfed997..7fc69065 100644 --- a/problems/0111.二叉树的最小深度.md +++ b/problems/0111.二叉树的最小深度.md @@ -413,4 +413,4 @@ var minDepth = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 9bb470e6..bfb03424 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -711,4 +711,4 @@ var pathsum = function(root, targetsum) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0115.不同的子序列.md b/problems/0115.不同的子序列.md index 3de9b3e1..5fe69b96 100644 --- a/problems/0115.不同的子序列.md +++ b/problems/0115.不同的子序列.md @@ -274,4 +274,4 @@ const numDistinct = (s, t) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0116.填充每个节点的下一个右侧节点指针.md b/problems/0116.填充每个节点的下一个右侧节点指针.md index be6c31e8..5aca82e1 100644 --- a/problems/0116.填充每个节点的下一个右侧节点指针.md +++ b/problems/0116.填充每个节点的下一个右侧节点指针.md @@ -260,4 +260,4 @@ const connect = root => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0121.买卖股票的最佳时机.md b/problems/0121.买卖股票的最佳时机.md index 9592c442..e30fa50a 100644 --- a/problems/0121.买卖股票的最佳时机.md +++ b/problems/0121.买卖股票的最佳时机.md @@ -360,4 +360,4 @@ const maxProfit = prices => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 061ffe19..41d83847 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -286,4 +286,4 @@ int maxProfit(int* prices, int pricesSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0122.买卖股票的最佳时机II(动态规划).md b/problems/0122.买卖股票的最佳时机II(动态规划).md index 31a8e6dc..4e64beaf 100644 --- a/problems/0122.买卖股票的最佳时机II(动态规划).md +++ b/problems/0122.买卖股票的最佳时机II(动态规划).md @@ -246,4 +246,4 @@ const maxProfit = (prices) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0123.买卖股票的最佳时机III.md b/problems/0123.买卖股票的最佳时机III.md index 80aa740f..fec39853 100644 --- a/problems/0123.买卖股票的最佳时机III.md +++ b/problems/0123.买卖股票的最佳时机III.md @@ -324,4 +324,4 @@ const maxProfit = prices => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0127.单词接龙.md b/problems/0127.单词接龙.md index 5a4edb9c..ad8467b5 100644 --- a/problems/0127.单词接龙.md +++ b/problems/0127.单词接龙.md @@ -181,4 +181,4 @@ var ladderLength = function(beginWord, endWord, wordList) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md index 86ed4eb2..54b7e44d 100644 --- a/problems/0129.求根到叶子节点数字之和.md +++ b/problems/0129.求根到叶子节点数字之和.md @@ -297,4 +297,4 @@ var sumNumbers = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index 81aa1522..811044da 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -424,4 +424,4 @@ var partition = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0132.分割回文串II.md b/problems/0132.分割回文串II.md index b104115a..dfb0ea93 100644 --- a/problems/0132.分割回文串II.md +++ b/problems/0132.分割回文串II.md @@ -290,4 +290,4 @@ var minCut = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md index 65bff8e9..7674c000 100644 --- a/problems/0134.加油站.md +++ b/problems/0134.加油站.md @@ -379,4 +379,4 @@ int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0135.分发糖果.md b/problems/0135.分发糖果.md index dddb4488..ace6bc7d 100644 --- a/problems/0135.分发糖果.md +++ b/problems/0135.分发糖果.md @@ -242,4 +242,4 @@ var candy = function(ratings) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0139.单词拆分.md b/problems/0139.单词拆分.md index b3158cb3..4af116a4 100644 --- a/problems/0139.单词拆分.md +++ b/problems/0139.单词拆分.md @@ -319,4 +319,4 @@ const wordBreak = (s, wordDict) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0141.环形链表.md b/problems/0141.环形链表.md index 70e2deb1..559ded41 100644 --- a/problems/0141.环形链表.md +++ b/problems/0141.环形链表.md @@ -132,4 +132,4 @@ var hasCycle = function(head) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0142.环形链表II.md b/problems/0142.环形链表II.md index 52ff7686..2e20e17e 100644 --- a/problems/0142.环形链表II.md +++ b/problems/0142.环形链表II.md @@ -334,4 +334,4 @@ extension ListNode: Equatable { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index cc82e625..c5ac9bae 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -461,4 +461,4 @@ var reorderList = function(head, s = [], tmp) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0150.逆波兰表达式求值.md b/problems/0150.逆波兰表达式求值.md index 859a6d98..0711803c 100644 --- a/problems/0150.逆波兰表达式求值.md +++ b/problems/0150.逆波兰表达式求值.md @@ -248,4 +248,4 @@ class Solution: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index 7902a398..8d28b332 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -553,4 +553,4 @@ func reverseWord(_ s: inout [Character]) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0160.相交链表.md b/problems/0160.相交链表.md index ce7296b3..1c513180 100644 --- a/problems/0160.相交链表.md +++ b/problems/0160.相交链表.md @@ -11,4 +11,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0188.买卖股票的最佳时机IV.md b/problems/0188.买卖股票的最佳时机IV.md index a0520fb4..5cffbe9e 100644 --- a/problems/0188.买卖股票的最佳时机IV.md +++ b/problems/0188.买卖股票的最佳时机IV.md @@ -331,4 +331,4 @@ var maxProfit = function(k, prices) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0189.旋转数组.md b/problems/0189.旋转数组.md index a08ee83e..c876a27a 100644 --- a/problems/0189.旋转数组.md +++ b/problems/0189.旋转数组.md @@ -155,4 +155,4 @@ var rotate = function (nums, k) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0198.打家劫舍.md b/problems/0198.打家劫舍.md index 4bf8a81a..66e95f28 100644 --- a/problems/0198.打家劫舍.md +++ b/problems/0198.打家劫舍.md @@ -198,4 +198,4 @@ const rob = nums => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0202.快乐数.md b/problems/0202.快乐数.md index 8f2e3bae..5704283d 100644 --- a/problems/0202.快乐数.md +++ b/problems/0202.快乐数.md @@ -284,4 +284,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0203.移除链表元素.md b/problems/0203.移除链表元素.md index 61c3e8ef..a41252de 100644 --- a/problems/0203.移除链表元素.md +++ b/problems/0203.移除链表元素.md @@ -362,4 +362,4 @@ func removeElements(head *ListNode, val int) *ListNode { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0205.同构字符串.md b/problems/0205.同构字符串.md index f68d4916..1eebd19d 100644 --- a/problems/0205.同构字符串.md +++ b/problems/0205.同构字符串.md @@ -145,4 +145,4 @@ var isIsomorphic = function(s, t) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index 3814b53d..96cd7c1e 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -375,4 +375,4 @@ func reverse(pre: ListNode?, cur: ListNode?) -> ListNode? { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md index fe3657c0..cc6b3bba 100644 --- a/problems/0209.长度最小的子数组.md +++ b/problems/0209.长度最小的子数组.md @@ -297,4 +297,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0213.打家劫舍II.md b/problems/0213.打家劫舍II.md index 044769d5..6f753a72 100644 --- a/problems/0213.打家劫舍II.md +++ b/problems/0213.打家劫舍II.md @@ -174,4 +174,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0216.组合总和III.md b/problems/0216.组合总和III.md index a6660d7a..8c9dcac2 100644 --- a/problems/0216.组合总和III.md +++ b/problems/0216.组合总和III.md @@ -454,4 +454,4 @@ int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0222.完全二叉树的节点个数.md b/problems/0222.完全二叉树的节点个数.md index 13f9f54d..dc09985d 100644 --- a/problems/0222.完全二叉树的节点个数.md +++ b/problems/0222.完全二叉树的节点个数.md @@ -455,4 +455,4 @@ var countNodes = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md index 3723f4a7..5adba07f 100644 --- a/problems/0225.用队列实现栈.md +++ b/problems/0225.用队列实现栈.md @@ -538,4 +538,4 @@ MyStack.prototype.empty = function() { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0226.翻转二叉树.md b/problems/0226.翻转二叉树.md index 157ee05c..c4ad42ca 100644 --- a/problems/0226.翻转二叉树.md +++ b/problems/0226.翻转二叉树.md @@ -569,4 +569,4 @@ var invertTree = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0232.用栈实现队列.md b/problems/0232.用栈实现队列.md index ba12e0ab..40406f51 100644 --- a/problems/0232.用栈实现队列.md +++ b/problems/0232.用栈实现队列.md @@ -356,4 +356,4 @@ MyQueue.prototype.empty = function() { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0234.回文链表.md b/problems/0234.回文链表.md index b3d55ada..db02a6ba 100644 --- a/problems/0234.回文链表.md +++ b/problems/0234.回文链表.md @@ -327,4 +327,4 @@ var isPalindrome = function(head) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0235.二叉搜索树的最近公共祖先.md b/problems/0235.二叉搜索树的最近公共祖先.md index 1d36ce37..fb1bd42c 100644 --- a/problems/0235.二叉搜索树的最近公共祖先.md +++ b/problems/0235.二叉搜索树的最近公共祖先.md @@ -357,4 +357,4 @@ var lowestCommonAncestor = function(root, p, q) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0236.二叉树的最近公共祖先.md b/problems/0236.二叉树的最近公共祖先.md index 215cb021..a469869a 100644 --- a/problems/0236.二叉树的最近公共祖先.md +++ b/problems/0236.二叉树的最近公共祖先.md @@ -345,4 +345,4 @@ var lowestCommonAncestor = function(root, p, q) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0239.滑动窗口最大值.md b/problems/0239.滑动窗口最大值.md index 48c65837..be46bd05 100644 --- a/problems/0239.滑动窗口最大值.md +++ b/problems/0239.滑动窗口最大值.md @@ -425,4 +425,4 @@ var maxSlidingWindow = function (nums, k) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0242.有效的字母异位词.md b/problems/0242.有效的字母异位词.md index c6981587..b0475a26 100644 --- a/problems/0242.有效的字母异位词.md +++ b/problems/0242.有效的字母异位词.md @@ -286,4 +286,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index 7438f924..c85186d5 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -516,4 +516,4 @@ var binaryTreePaths = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0279.完全平方数.md b/problems/0279.完全平方数.md index ca7c4966..a00ed47e 100644 --- a/problems/0279.完全平方数.md +++ b/problems/0279.完全平方数.md @@ -361,4 +361,4 @@ var numSquares2 = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0283.移动零.md b/problems/0283.移动零.md index 5ff2871c..2e8743e3 100644 --- a/problems/0283.移动零.md +++ b/problems/0283.移动零.md @@ -116,4 +116,4 @@ var moveZeroes = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0300.最长上升子序列.md b/problems/0300.最长上升子序列.md index fe88ef26..fe95cfed 100644 --- a/problems/0300.最长上升子序列.md +++ b/problems/0300.最长上升子序列.md @@ -202,4 +202,4 @@ const lengthOfLIS = (nums) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0309.最佳买卖股票时机含冷冻期.md b/problems/0309.最佳买卖股票时机含冷冻期.md index 47da9584..2d0ee105 100644 --- a/problems/0309.最佳买卖股票时机含冷冻期.md +++ b/problems/0309.最佳买卖股票时机含冷冻期.md @@ -237,4 +237,4 @@ const maxProfit = (prices) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0322.零钱兑换.md b/problems/0322.零钱兑换.md index 8e03b391..63bde655 100644 --- a/problems/0322.零钱兑换.md +++ b/problems/0322.零钱兑换.md @@ -330,4 +330,4 @@ const coinChange = (coins, amount) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index 6f993e3e..9a9cada9 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -450,4 +450,4 @@ var findItinerary = function(tickets) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0337.打家劫舍III.md b/problems/0337.打家劫舍III.md index f65bcdb6..949137c3 100644 --- a/problems/0337.打家劫舍III.md +++ b/problems/0337.打家劫舍III.md @@ -402,4 +402,4 @@ const rob = root => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0343.整数拆分.md b/problems/0343.整数拆分.md index 1f025051..78c94f2a 100644 --- a/problems/0343.整数拆分.md +++ b/problems/0343.整数拆分.md @@ -276,4 +276,4 @@ var integerBreak = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0344.反转字符串.md b/problems/0344.反转字符串.md index 8dc0e082..17543486 100644 --- a/problems/0344.反转字符串.md +++ b/problems/0344.反转字符串.md @@ -233,4 +233,4 @@ func reverseString(_ s: inout [Character]) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0347.前K个高频元素.md b/problems/0347.前K个高频元素.md index 315c184b..941878d4 100644 --- a/problems/0347.前K个高频元素.md +++ b/problems/0347.前K个高频元素.md @@ -364,4 +364,4 @@ PriorityQueue.prototype.compare = function(index1, index2) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 8c170ed9..3f39f889 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -266,4 +266,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index 74a75ef1..23348bd0 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -192,4 +192,4 @@ var wiggleMaxLength = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0377.组合总和Ⅳ.md b/problems/0377.组合总和Ⅳ.md index 81e9dee3..2a507c42 100644 --- a/problems/0377.组合总和Ⅳ.md +++ b/problems/0377.组合总和Ⅳ.md @@ -246,4 +246,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md index ac851fcd..d227dde0 100644 --- a/problems/0383.赎金信.md +++ b/problems/0383.赎金信.md @@ -342,4 +342,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0392.判断子序列.md b/problems/0392.判断子序列.md index 43cfbe7e..cda0c82d 100644 --- a/problems/0392.判断子序列.md +++ b/problems/0392.判断子序列.md @@ -231,4 +231,4 @@ func isSubsequence(s string, t string) bool { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index 1fac7c9b..e55981e2 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -382,4 +382,4 @@ var sumOfLeftLeaves = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md index 91e10cd5..f7d9d805 100644 --- a/problems/0406.根据身高重建队列.md +++ b/problems/0406.根据身高重建队列.md @@ -297,4 +297,4 @@ var reconstructQueue = function(people) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index 60695d1e..fd20f68a 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -293,4 +293,4 @@ var canPartition = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index 282404d8..79083716 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -319,4 +319,4 @@ var eraseOverlapIntervals = function(intervals) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index 6fa7fa2d..32dd862e 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -491,4 +491,4 @@ var deleteNode = function (root, key) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0452.用最少数量的箭引爆气球.md b/problems/0452.用最少数量的箭引爆气球.md index 75ad01e8..c3c9b827 100644 --- a/problems/0452.用最少数量的箭引爆气球.md +++ b/problems/0452.用最少数量的箭引爆气球.md @@ -247,4 +247,4 @@ int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0454.四数相加II.md b/problems/0454.四数相加II.md index 4f030268..d12f0233 100644 --- a/problems/0454.四数相加II.md +++ b/problems/0454.四数相加II.md @@ -286,4 +286,4 @@ impl Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0455.分发饼干.md b/problems/0455.分发饼干.md index 41f04600..80a6172d 100644 --- a/problems/0455.分发饼干.md +++ b/problems/0455.分发饼干.md @@ -245,4 +245,4 @@ int findContentChildren(int* g, int gSize, int* s, int sSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index 6d9b8d9f..b193acdc 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -369,4 +369,4 @@ var repeatedSubstringPattern = function (s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0463.岛屿的周长.md b/problems/0463.岛屿的周长.md index 9543afb8..3b0278a6 100644 --- a/problems/0463.岛屿的周长.md +++ b/problems/0463.岛屿的周长.md @@ -182,4 +182,4 @@ var islandPerimeter = function(grid) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0474.一和零.md b/problems/0474.一和零.md index 108a5ee3..c8715b39 100644 --- a/problems/0474.一和零.md +++ b/problems/0474.一和零.md @@ -331,4 +331,4 @@ const findMaxForm = (strs, m, n) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0491.递增子序列.md b/problems/0491.递增子序列.md index d793e23c..e947b2b9 100644 --- a/problems/0491.递增子序列.md +++ b/problems/0491.递增子序列.md @@ -385,4 +385,4 @@ int** findSubsequences(int* nums, int numsSize, int* returnSize, int** returnCol * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index a2388edf..210ac749 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -392,4 +392,4 @@ const findTargetSumWays = (nums, target) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0496.下一个更大元素I.md b/problems/0496.下一个更大元素I.md index d7fd1d94..89549924 100644 --- a/problems/0496.下一个更大元素I.md +++ b/problems/0496.下一个更大元素I.md @@ -305,4 +305,4 @@ var nextGreaterElement = function (nums1, nums2) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md index 1d24367e..29e5e139 100644 --- a/problems/0501.二叉搜索树中的众数.md +++ b/problems/0501.二叉搜索树中的众数.md @@ -690,4 +690,4 @@ var findMode = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0503.下一个更大元素II.md b/problems/0503.下一个更大元素II.md index 13adc024..10b6edea 100644 --- a/problems/0503.下一个更大元素II.md +++ b/problems/0503.下一个更大元素II.md @@ -189,4 +189,4 @@ var nextGreaterElements = function (nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0509.斐波那契数.md b/problems/0509.斐波那契数.md index 86591157..4102dd64 100644 --- a/problems/0509.斐波那契数.md +++ b/problems/0509.斐波那契数.md @@ -238,4 +238,4 @@ var fib = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0513.找树左下角的值.md b/problems/0513.找树左下角的值.md index ef44f700..d09ec94d 100644 --- a/problems/0513.找树左下角的值.md +++ b/problems/0513.找树左下角的值.md @@ -441,4 +441,4 @@ var findBottomLeftValue = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0516.最长回文子序列.md b/problems/0516.最长回文子序列.md index 629e9247..e413ea70 100644 --- a/problems/0516.最长回文子序列.md +++ b/problems/0516.最长回文子序列.md @@ -243,4 +243,4 @@ const longestPalindromeSubseq = (s) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0518.零钱兑换II.md b/problems/0518.零钱兑换II.md index 44c00131..52ec9149 100644 --- a/problems/0518.零钱兑换II.md +++ b/problems/0518.零钱兑换II.md @@ -266,4 +266,4 @@ const change = (amount, coins) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0530.二叉搜索树的最小绝对差.md b/problems/0530.二叉搜索树的最小绝对差.md index e4467178..67a81930 100644 --- a/problems/0530.二叉搜索树的最小绝对差.md +++ b/problems/0530.二叉搜索树的最小绝对差.md @@ -370,4 +370,4 @@ var getMinimumDifference = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0538.把二叉搜索树转换为累加树.md b/problems/0538.把二叉搜索树转换为累加树.md index baeb300f..f2b97989 100644 --- a/problems/0538.把二叉搜索树转换为累加树.md +++ b/problems/0538.把二叉搜索树转换为累加树.md @@ -277,4 +277,4 @@ var convertBST = function (root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0541.反转字符串II.md b/problems/0541.反转字符串II.md index e6939c89..26e6e847 100644 --- a/problems/0541.反转字符串II.md +++ b/problems/0541.反转字符串II.md @@ -282,4 +282,4 @@ func reverseStr(_ s: String, _ k: Int) -> String { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0583.两个字符串的删除操作.md b/problems/0583.两个字符串的删除操作.md index 4935d10c..fa473062 100644 --- a/problems/0583.两个字符串的删除操作.md +++ b/problems/0583.两个字符串的删除操作.md @@ -211,4 +211,4 @@ const minDistance = (word1, word2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0617.合并二叉树.md b/problems/0617.合并二叉树.md index f3b33230..8645cbc2 100644 --- a/problems/0617.合并二叉树.md +++ b/problems/0617.合并二叉树.md @@ -590,4 +590,4 @@ var mergeTrees = function(root1, root2) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0647.回文子串.md b/problems/0647.回文子串.md index f2d0e7e5..cdc6b2e3 100644 --- a/problems/0647.回文子串.md +++ b/problems/0647.回文子串.md @@ -412,4 +412,4 @@ const countSubstrings = (s) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0649.Dota2参议院.md b/problems/0649.Dota2参议院.md index c53262ad..41b2b361 100644 --- a/problems/0649.Dota2参议院.md +++ b/problems/0649.Dota2参议院.md @@ -251,4 +251,4 @@ var predictPartyVictory = function(senateStr) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0654.最大二叉树.md b/problems/0654.最大二叉树.md index aa84c8a6..a4ae868a 100644 --- a/problems/0654.最大二叉树.md +++ b/problems/0654.最大二叉树.md @@ -362,4 +362,4 @@ var constructMaximumBinaryTree = function (nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0657.机器人能否返回原点.md b/problems/0657.机器人能否返回原点.md index 4e48698e..fb35c15b 100644 --- a/problems/0657.机器人能否返回原点.md +++ b/problems/0657.机器人能否返回原点.md @@ -156,4 +156,4 @@ var judgeCircle = function(moves) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0669.修剪二叉搜索树.md b/problems/0669.修剪二叉搜索树.md index ffb00b78..23269bb7 100644 --- a/problems/0669.修剪二叉搜索树.md +++ b/problems/0669.修剪二叉搜索树.md @@ -395,4 +395,4 @@ var trimBST = function (root,low,high) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0673.最长递增子序列的个数.md b/problems/0673.最长递增子序列的个数.md index 13da076b..4be91db1 100644 --- a/problems/0673.最长递增子序列的个数.md +++ b/problems/0673.最长递增子序列的个数.md @@ -366,4 +366,4 @@ var findNumberOfLIS = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0674.最长连续递增序列.md b/problems/0674.最长连续递增序列.md index 383f770e..c81155cb 100644 --- a/problems/0674.最长连续递增序列.md +++ b/problems/0674.最长连续递增序列.md @@ -268,4 +268,4 @@ const findLengthOfLCIS = (nums) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0684.冗余连接.md b/problems/0684.冗余连接.md index 015c04e7..48ee6011 100644 --- a/problems/0684.冗余连接.md +++ b/problems/0684.冗余连接.md @@ -353,4 +353,4 @@ var findRedundantConnection = function(edges) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0685.冗余连接II.md b/problems/0685.冗余连接II.md index c73e37aa..cbd6cc2d 100644 --- a/problems/0685.冗余连接II.md +++ b/problems/0685.冗余连接II.md @@ -606,4 +606,4 @@ var findRedundantDirectedConnection = function(edges) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0700.二叉搜索树中的搜索.md b/problems/0700.二叉搜索树中的搜索.md index e4227eb1..bf67ce0e 100644 --- a/problems/0700.二叉搜索树中的搜索.md +++ b/problems/0700.二叉搜索树中的搜索.md @@ -342,4 +342,4 @@ var searchBST = function (root, val) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0701.二叉搜索树中的插入操作.md b/problems/0701.二叉搜索树中的插入操作.md index 33e9999c..0d3d676b 100644 --- a/problems/0701.二叉搜索树中的插入操作.md +++ b/problems/0701.二叉搜索树中的插入操作.md @@ -492,4 +492,4 @@ var insertIntoBST = function (root, val) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index 92c23cab..e1900276 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -530,4 +530,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md index 5dc9325b..64472506 100644 --- a/problems/0707.设计链表.md +++ b/problems/0707.设计链表.md @@ -1152,4 +1152,4 @@ class MyLinkedList { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md index cdedd506..c6a147b4 100644 --- a/problems/0714.买卖股票的最佳时机含手续费.md +++ b/problems/0714.买卖股票的最佳时机含手续费.md @@ -269,4 +269,4 @@ var maxProfit = function(prices, fee) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0714.买卖股票的最佳时机含手续费(动态规划).md b/problems/0714.买卖股票的最佳时机含手续费(动态规划).md index d1dfeb91..8dd0894e 100644 --- a/problems/0714.买卖股票的最佳时机含手续费(动态规划).md +++ b/problems/0714.买卖股票的最佳时机含手续费(动态规划).md @@ -190,4 +190,4 @@ const maxProfit = (prices,fee) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0718.最长重复子数组.md b/problems/0718.最长重复子数组.md index d3488a06..54d1b07e 100644 --- a/problems/0718.最长重复子数组.md +++ b/problems/0718.最长重复子数组.md @@ -304,4 +304,4 @@ const findLength = (nums1, nums2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0724.寻找数组的中心索引.md b/problems/0724.寻找数组的中心索引.md index 651268c2..13d2ab68 100644 --- a/problems/0724.寻找数组的中心索引.md +++ b/problems/0724.寻找数组的中心索引.md @@ -147,4 +147,4 @@ var pivotIndex = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md index 70c571db..0db0db15 100644 --- a/problems/0738.单调递增的数字.md +++ b/problems/0738.单调递增的数字.md @@ -209,4 +209,4 @@ var monotoneIncreasingDigits = function(n) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md index 5e570307..612b3c75 100644 --- a/problems/0739.每日温度.md +++ b/problems/0739.每日温度.md @@ -313,4 +313,4 @@ var dailyTemperatures = function(temperatures) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0746.使用最小花费爬楼梯.md b/problems/0746.使用最小花费爬楼梯.md index 9e1a430e..96bfbb7c 100644 --- a/problems/0746.使用最小花费爬楼梯.md +++ b/problems/0746.使用最小花费爬楼梯.md @@ -272,4 +272,4 @@ var minCostClimbingStairs = function(cost) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md index bb327db2..863b569d 100644 --- a/problems/0763.划分字母区间.md +++ b/problems/0763.划分字母区间.md @@ -181,4 +181,4 @@ var partitionLabels = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md index 551ca077..42e6337f 100644 --- a/problems/0841.钥匙和房间.md +++ b/problems/0841.钥匙和房间.md @@ -275,4 +275,4 @@ var canVisitAllRooms = function(rooms) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md index e0f51bd3..a60fca22 100644 --- a/problems/0844.比较含退格的字符串.md +++ b/problems/0844.比较含退格的字符串.md @@ -296,4 +296,4 @@ var backspaceCompare = function(s, t) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0860.柠檬水找零.md b/problems/0860.柠檬水找零.md index 91a1450d..2e6065b4 100644 --- a/problems/0860.柠檬水找零.md +++ b/problems/0860.柠檬水找零.md @@ -260,4 +260,4 @@ var lemonadeChange = function(bills) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0922.按奇偶排序数组II.md b/problems/0922.按奇偶排序数组II.md index 85549682..43046133 100644 --- a/problems/0922.按奇偶排序数组II.md +++ b/problems/0922.按奇偶排序数组II.md @@ -267,4 +267,4 @@ var sortArrayByParityII = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0925.长按键入.md b/problems/0925.长按键入.md index 014b7b17..d40f619b 100644 --- a/problems/0925.长按键入.md +++ b/problems/0925.长按键入.md @@ -216,4 +216,4 @@ var isLongPressedName = function(name, typed) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0941.有效的山脉数组.md b/problems/0941.有效的山脉数组.md index 9079a747..9416b309 100644 --- a/problems/0941.有效的山脉数组.md +++ b/problems/0941.有效的山脉数组.md @@ -173,4 +173,4 @@ var validMountainArray = function(arr) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0968.监控二叉树.md b/problems/0968.监控二叉树.md index 579b38ab..3d698164 100644 --- a/problems/0968.监控二叉树.md +++ b/problems/0968.监控二叉树.md @@ -510,4 +510,4 @@ int minCameraCover(struct TreeNode* root){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/0977.有序数组的平方.md b/problems/0977.有序数组的平方.md index 12b413e1..0d9f2ac1 100644 --- a/problems/0977.有序数组的平方.md +++ b/problems/0977.有序数组的平方.md @@ -339,4 +339,4 @@ class Solution { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1002.查找常用字符.md b/problems/1002.查找常用字符.md index 56feb20c..09e49c4f 100644 --- a/problems/1002.查找常用字符.md +++ b/problems/1002.查找常用字符.md @@ -339,4 +339,4 @@ func commonChars(_ words: [String]) -> [String] { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1005.K次取反后最大化的数组和.md b/problems/1005.K次取反后最大化的数组和.md index 1d552590..1b5386fd 100644 --- a/problems/1005.K次取反后最大化的数组和.md +++ b/problems/1005.K次取反后最大化的数组和.md @@ -217,4 +217,4 @@ var largestSumAfterKNegations = function(nums, k) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1035.不相交的线.md b/problems/1035.不相交的线.md index e9b03e24..f4e8f702 100644 --- a/problems/1035.不相交的线.md +++ b/problems/1035.不相交的线.md @@ -174,4 +174,4 @@ const maxUncrossedLines = (nums1, nums2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1047.删除字符串中的所有相邻重复项.md b/problems/1047.删除字符串中的所有相邻重复项.md index 420b64df..f70f39f3 100644 --- a/problems/1047.删除字符串中的所有相邻重复项.md +++ b/problems/1047.删除字符串中的所有相邻重复项.md @@ -275,4 +275,4 @@ var removeDuplicates = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1049.最后一块石头的重量II.md b/problems/1049.最后一块石头的重量II.md index 390e8c70..4ac80409 100644 --- a/problems/1049.最后一块石头的重量II.md +++ b/problems/1049.最后一块石头的重量II.md @@ -246,4 +246,4 @@ var lastStoneWeightII = function (stones) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1143.最长公共子序列.md b/problems/1143.最长公共子序列.md index 005d333a..55083d89 100644 --- a/problems/1143.最长公共子序列.md +++ b/problems/1143.最长公共子序列.md @@ -221,4 +221,4 @@ const longestCommonSubsequence = (text1, text2) => { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1207.独一无二的出现次数.md b/problems/1207.独一无二的出现次数.md index 97a66da1..a65b26e6 100644 --- a/problems/1207.独一无二的出现次数.md +++ b/problems/1207.独一无二的出现次数.md @@ -140,4 +140,4 @@ var uniqueOccurrences = function(arr) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1221.分割平衡字符串.md b/problems/1221.分割平衡字符串.md index cd859418..cec49d0b 100644 --- a/problems/1221.分割平衡字符串.md +++ b/problems/1221.分割平衡字符串.md @@ -124,4 +124,4 @@ var balancedStringSplit = function(s) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1356.根据数字二进制下1的数目排序.md b/problems/1356.根据数字二进制下1的数目排序.md index 953c8cfa..a122df6f 100644 --- a/problems/1356.根据数字二进制下1的数目排序.md +++ b/problems/1356.根据数字二进制下1的数目排序.md @@ -185,4 +185,4 @@ var sortByBits = function(arr) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1365.有多少小于当前数字的数字.md b/problems/1365.有多少小于当前数字的数字.md index b3b6df4a..69654930 100644 --- a/problems/1365.有多少小于当前数字的数字.md +++ b/problems/1365.有多少小于当前数字的数字.md @@ -178,4 +178,4 @@ var smallerNumbersThanCurrent = function(nums) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/1382.将二叉搜索树变平衡.md b/problems/1382.将二叉搜索树变平衡.md index 23084934..b7c1bec4 100644 --- a/problems/1382.将二叉搜索树变平衡.md +++ b/problems/1382.将二叉搜索树变平衡.md @@ -156,4 +156,4 @@ var balanceBST = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md index e7a316fb..f9aee37f 100644 --- a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md +++ b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md @@ -235,4 +235,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md b/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md index 08841565..af2b66ae 100644 --- a/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md +++ b/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md @@ -207,4 +207,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树中递归带着回溯.md b/problems/二叉树中递归带着回溯.md index 6bb4ba3d..71a3ee5c 100644 --- a/problems/二叉树中递归带着回溯.md +++ b/problems/二叉树中递归带着回溯.md @@ -523,4 +523,4 @@ var binaryTreePaths = function(root) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树总结篇.md b/problems/二叉树总结篇.md index 9563acf6..37696fc0 100644 --- a/problems/二叉树总结篇.md +++ b/problems/二叉树总结篇.md @@ -175,4 +175,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树理论基础.md b/problems/二叉树理论基础.md index c7b316b3..b473861d 100644 --- a/problems/二叉树理论基础.md +++ b/problems/二叉树理论基础.md @@ -234,4 +234,4 @@ function TreeNode(val, left, right) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树的统一迭代法.md b/problems/二叉树的统一迭代法.md index 3fa73851..19962cba 100644 --- a/problems/二叉树的统一迭代法.md +++ b/problems/二叉树的统一迭代法.md @@ -530,4 +530,4 @@ var postorderTraversal = function(root, res = []) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树的迭代遍历.md b/problems/二叉树的迭代遍历.md index ae0bc98d..6889ecc0 100644 --- a/problems/二叉树的迭代遍历.md +++ b/problems/二叉树的迭代遍历.md @@ -473,4 +473,4 @@ var postorderTraversal = function(root, res = []) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index 06d0d39e..eee150b7 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -415,4 +415,4 @@ int* postorderTraversal(struct TreeNode* root, int* returnSize){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/关于时间复杂度,你不知道的都在这里!.md b/problems/关于时间复杂度,你不知道的都在这里!.md index 94f4bd1d..105c2b24 100644 --- a/problems/关于时间复杂度,你不知道的都在这里!.md +++ b/problems/关于时间复杂度,你不知道的都在这里!.md @@ -177,4 +177,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/剑指Offer05.替换空格.md b/problems/剑指Offer05.替换空格.md index 86d6baf8..232d1a0a 100644 --- a/problems/剑指Offer05.替换空格.md +++ b/problems/剑指Offer05.替换空格.md @@ -313,4 +313,4 @@ func replaceSpace(_ s: String) -> String { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md index 3767c6dd..29243c6d 100644 --- a/problems/剑指Offer58-II.左旋转字符串.md +++ b/problems/剑指Offer58-II.左旋转字符串.md @@ -249,4 +249,4 @@ func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/动态规划-股票问题总结篇.md b/problems/动态规划-股票问题总结篇.md index b2a3e8da..899b9f6e 100644 --- a/problems/动态规划-股票问题总结篇.md +++ b/problems/动态规划-股票问题总结篇.md @@ -486,4 +486,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/动态规划总结篇.md b/problems/动态规划总结篇.md index 512fad08..1f62b9df 100644 --- a/problems/动态规划总结篇.md +++ b/problems/动态规划总结篇.md @@ -137,4 +137,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/动态规划理论基础.md b/problems/动态规划理论基础.md index 7a7a304b..728f0d7e 100644 --- a/problems/动态规划理论基础.md +++ b/problems/动态规划理论基础.md @@ -132,4 +132,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/双指针总结.md b/problems/双指针总结.md index f5e7ba67..bea1359c 100644 --- a/problems/双指针总结.md +++ b/problems/双指针总结.md @@ -100,4 +100,4 @@ for (int i = 0; i < array.size(); i++) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/哈希表总结.md b/problems/哈希表总结.md index 71100bf6..99a60585 100644 --- a/problems/哈希表总结.md +++ b/problems/哈希表总结.md @@ -131,4 +131,4 @@ std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层 * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/哈希表理论基础.md b/problems/哈希表理论基础.md index 331d26c8..aeb11b2e 100644 --- a/problems/哈希表理论基础.md +++ b/problems/哈希表理论基础.md @@ -133,4 +133,4 @@ std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底 * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/回溯总结.md b/problems/回溯总结.md index ebbcb073..421691da 100644 --- a/problems/回溯总结.md +++ b/problems/回溯总结.md @@ -454,4 +454,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/回溯算法去重问题的另一种写法.md b/problems/回溯算法去重问题的另一种写法.md index cfc8ad86..8e92b95b 100644 --- a/problems/回溯算法去重问题的另一种写法.md +++ b/problems/回溯算法去重问题的另一种写法.md @@ -263,4 +263,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/回溯算法理论基础.md b/problems/回溯算法理论基础.md index 286d0b77..c11200a2 100644 --- a/problems/回溯算法理论基础.md +++ b/problems/回溯算法理论基础.md @@ -175,4 +175,4 @@ void backtracking(参数) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/字符串总结.md b/problems/字符串总结.md index 258ea0ef..5ac415a9 100644 --- a/problems/字符串总结.md +++ b/problems/字符串总结.md @@ -130,4 +130,4 @@ KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易 * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md index 0bf90c66..3794bd45 100644 --- a/problems/数组总结篇.md +++ b/problems/数组总结篇.md @@ -149,4 +149,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/数组理论基础.md b/problems/数组理论基础.md index b53665ee..15fbe9e4 100644 --- a/problems/数组理论基础.md +++ b/problems/数组理论基础.md @@ -124,4 +124,4 @@ public static void test_arr() { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/栈与队列总结.md b/problems/栈与队列总结.md index db8e1296..b745ea19 100644 --- a/problems/栈与队列总结.md +++ b/problems/栈与队列总结.md @@ -181,4 +181,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/栈与队列理论基础.md b/problems/栈与队列理论基础.md index 8c2effec..3889b7ba 100644 --- a/problems/栈与队列理论基础.md +++ b/problems/栈与队列理论基础.md @@ -94,4 +94,4 @@ std::queue> third; // 定义以list为底层容器的队列 * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/根据身高重建队列(vector原理讲解).md b/problems/根据身高重建队列(vector原理讲解).md index 143ee01f..6d11fcbe 100644 --- a/problems/根据身高重建队列(vector原理讲解).md +++ b/problems/根据身高重建队列(vector原理讲解).md @@ -180,4 +180,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/算法模板.md b/problems/算法模板.md index 0cf8431d..df823e81 100644 --- a/problems/算法模板.md +++ b/problems/算法模板.md @@ -296,4 +296,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包总结篇.md b/problems/背包总结篇.md index 6086274e..784f8441 100644 --- a/problems/背包总结篇.md +++ b/problems/背包总结篇.md @@ -101,4 +101,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index b2cee391..a10f92a1 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -431,4 +431,4 @@ test(); * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包理论基础01背包-2.md b/problems/背包理论基础01背包-2.md index ac551565..9bdbe8bc 100644 --- a/problems/背包理论基础01背包-2.md +++ b/problems/背包理论基础01背包-2.md @@ -323,4 +323,4 @@ test(); * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包问题理论基础多重背包.md b/problems/背包问题理论基础多重背包.md index 814c9711..e5eb222d 100644 --- a/problems/背包问题理论基础多重背包.md +++ b/problems/背包问题理论基础多重背包.md @@ -209,4 +209,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md index 4f3ef9ba..3420f822 100644 --- a/problems/背包问题理论基础完全背包.md +++ b/problems/背包问题理论基础完全背包.md @@ -349,4 +349,4 @@ function test_completePack2() { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/贪心算法总结篇.md b/problems/贪心算法总结篇.md index a203494e..09d22da1 100644 --- a/problems/贪心算法总结篇.md +++ b/problems/贪心算法总结篇.md @@ -158,4 +158,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/贪心算法理论基础.md b/problems/贪心算法理论基础.md index 495348d0..f851d66b 100644 --- a/problems/贪心算法理论基础.md +++ b/problems/贪心算法理论基础.md @@ -94,4 +94,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/链表总结篇.md b/problems/链表总结篇.md index 64a7b42a..c0bc197b 100644 --- a/problems/链表总结篇.md +++ b/problems/链表总结篇.md @@ -98,4 +98,4 @@ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/链表理论基础.md b/problems/链表理论基础.md index 7e0cd431..42d952c2 100644 --- a/problems/链表理论基础.md +++ b/problems/链表理论基础.md @@ -159,4 +159,4 @@ Go: * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
diff --git a/problems/面试题02.07.链表相交.md b/problems/面试题02.07.链表相交.md index d694899d..f283b161 100644 --- a/problems/面试题02.07.链表相交.md +++ b/problems/面试题02.07.链表相交.md @@ -258,4 +258,4 @@ var getIntersectionNode = function(headA, headB) { * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
+
From dc767e9f20f26e18e4dbf959134ca104f7282514 Mon Sep 17 00:00:00 2001 From: baichangfu Date: Wed, 29 Sep 2021 13:23:21 +0800 Subject: [PATCH 150/222] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF<02?= =?UTF-8?q?03.=E7=A7=BB=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0203.移除链表元素.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0203.移除链表元素.md b/problems/0203.移除链表元素.md index 61c3e8ef..82c5184c 100644 --- a/problems/0203.移除链表元素.md +++ b/problems/0203.移除链表元素.md @@ -40,7 +40,7 @@ **当然如果使用java ,python的话就不用手动管理内存了。** -还要说明一下,就算使用C++来做leetcode,如果移除一个节点之后,没有手动在内存中删除这个节点,leetcode依然也是可以通过的,只不过,内存使用的空间大一些而已,但建议依然要养生手动清理内存的习惯。 +还要说明一下,就算使用C++来做leetcode,如果移除一个节点之后,没有手动在内存中删除这个节点,leetcode依然也是可以通过的,只不过,内存使用的空间大一些而已,但建议依然要养成手动清理内存的习惯。 这种情况下的移除操作,就是让节点next指针直接指向下下一个节点就可以了, From f79ddfb2dd222a8d0ff36d6bb49dcdb83055c88b Mon Sep 17 00:00:00 2001 From: baichangfu Date: Wed, 29 Sep 2021 16:31:06 +0800 Subject: [PATCH 151/222] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF<02?= =?UTF-8?q?06.=E7=BF=BB=E8=BD=AC=E9=93=BE=E8=A1=A8>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0206.翻转链表.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index 3814b53d..9b483484 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -27,9 +27,9 @@ ![206_反转链表](https://img-blog.csdnimg.cn/20210218090901207.png) -之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改表next指针的方向。 +之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。 -那么接下来看一看是如何反转呢? +那么接下来看一看是如何反转的呢? 我们拿有示例中的链表来举例,如动画所示: From 1ab2f9bc5b44457f6c711e6957d2e770b9570661 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Wed, 29 Sep 2021 18:24:09 +0800 Subject: [PATCH 152/222] =?UTF-8?q?Update=200042.=E6=8E=A5=E9=9B=A8?= =?UTF-8?q?=E6=B0=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python备注,和规范python代码 --- problems/0042.接雨水.md | 70 +++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 12 deletions(-) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index f0d0ecb3..bc397863 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -515,20 +515,66 @@ class Solution: ```python3 class Solution: def trap(self, height: List[int]) -> int: - st =[0] + # 单调栈 + ''' + 单调栈是按照 行 的方向来计算雨水 + 从栈顶到栈底的顺序:从小到大 + 通过三个元素来接水:栈顶,栈顶的下一个元素,以及即将入栈的元素 + 雨水高度是 min(凹槽左边高度, 凹槽右边高度) - 凹槽底部高度 + 雨水的宽度是 凹槽右边的下标 - 凹槽左边的下标 - 1(因为只求中间宽度) + ''' + # stack储存index,用于计算对应的柱子高度 + stack = [0] result = 0 - for i in range(1,len(height)): - while st!=[] and height[i]>height[st[-1]]: - midh = height[st[-1]] - st.pop() - if st!=[]: - hright = height[i] - hleft = height[st[-1]] - h = min(hright,hleft)-midh - w = i-st[-1]-1 - result+=h*w - st.append(i) + for i in range(1, len(height)): + # 情况一 + if height[i] < height[stack[-1]]: + stack.append(i) + + # 情况二 + # 当当前柱子高度和栈顶一致时,左边的一个是不可能存放雨水的,所以保留右侧新柱子 + # 需要使用最右边的柱子来计算宽度 + elif height[i] == height[stack[-1]]: + stack.pop() + stack.append(i) + + # 情况三 + else: + # 抛出所有较低的柱子 + while stack and height[i] > height[stack[-1]]: + # 栈顶就是中间的柱子:储水槽,就是凹槽的地步 + mid_height = height[stack[-1]] + stack.pop() + if stack: + right_height = height[i] + left_height = height[stack[-1]] + # 两侧的较矮一方的高度 - 凹槽底部高度 + h = min(right_height, left_height) - mid_height + # 凹槽右侧下标 - 凹槽左侧下标 - 1: 只求中间宽度 + w = i - stack[-1] - 1 + # 体积:高乘宽 + result += h * w + stack.append(i) return result + +# 单调栈压缩版 +class Solution: + def trap(self, height: List[int]) -> int: + stack = [0] + result = 0 + for i in range(1, len(height)): + while stack and height[i] > height[stack[-1]]: + mid_height = stack.pop() + if stack: + # 雨水高度是 min(凹槽左侧高度, 凹槽右侧高度) - 凹槽底部高度 + h = min(height[stack[-1]], height[i]) - height[mid_height] + # 雨水宽度是 凹槽右侧的下标 - 凹槽左侧的下标 - 1 + w = i - stack[-1] - 1 + # 累计总雨水体积 + result += h * w + stack.append(i) + return result + ``` Go: From 5a37bed1354caa491af686bb3a40ffe7ba94c983 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Thu, 30 Sep 2021 16:32:53 +0800 Subject: [PATCH 153/222] =?UTF-8?q?Update=200084.=E6=9F=B1=E7=8A=B6?= =?UTF-8?q?=E5=9B=BE=E4=B8=AD=E6=9C=80=E5=A4=A7=E7=9A=84=E7=9F=A9=E5=BD=A2?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补全所有python解法,补充comment --- problems/0084.柱状图中最大的矩形.md | 161 ++++++++++++++----- 1 file changed, 123 insertions(+), 38 deletions(-) diff --git a/problems/0084.柱状图中最大的矩形.md b/problems/0084.柱状图中最大的矩形.md index ccb59fbe..427c23b9 100644 --- a/problems/0084.柱状图中最大的矩形.md +++ b/problems/0084.柱状图中最大的矩形.md @@ -281,52 +281,137 @@ class Solution { Python: -动态规划 ```python3 + +# 双指针;暴力解法(leetcode超时) class Solution: def largestRectangleArea(self, heights: List[int]) -> int: - result = 0 - minleftindex, minrightindex = [0]*len(heights), [0]*len(heights) - - minleftindex[0]=-1 - for i in range(1,len(heights)): - t = i-1 - while t>=0 and heights[t]>=heights[i]: t=minleftindex[t] - minleftindex[i]=t - - minrightindex[-1]=len(heights) - for i in range(len(heights)-2,-1,-1): - t=i+1 - while t=heights[i]: t=minrightindex[t] - minrightindex[i]=t - - for i in range(0,len(heights)): - left = minleftindex[i] - right = minrightindex[i] - summ = (right-left-1)*heights[i] - result = max(result,summ) - return result -``` -单调栈 版本二 -```python3 + # 从左向右遍历:以每一根柱子为主心骨(当前轮最高的参照物),迭代直到找到左侧和右侧各第一个矮一级的柱子 + res = 0 + + for i in range(len(heights)): + left = i + right = i + # 向左侧遍历:寻找第一个矮一级的柱子 + for _ in range(left, -1, -1): + if heights[left] < heights[i]: + break + left -= 1 + # 向右侧遍历:寻找第一个矮一级的柱子 + for _ in range(right, len(heights)): + if heights[right] < heights[i]: + break + right += 1 + + width = right - left - 1 + height = heights[i] + res = max(res, width * height) + + return res + +# DP动态规划 class Solution: def largestRectangleArea(self, heights: List[int]) -> int: - heights.insert(0,0) # 数组头部加入元素0 - heights.append(0) # 数组尾部加入元素0 - st = [0] + size = len(heights) + # 两个DP数列储存的均是下标index + min_left_index = [0] * size + min_right_index = [0] * size result = 0 - for i in range(1,len(heights)): - while st!=[] and heights[i]= 0 and heights[temp] >= heights[i]: + # 当左侧的柱子持续较高时,尝试这个高柱子自己的次级柱子(DP + temp = min_left_index[temp] + # 当找到左侧矮一级的目标柱子时 + min_left_index[i] = temp + + # 记录每个柱子的右侧第一个矮一级的柱子的下标 + min_right_index[size-1] = size # 初始化防止while死循环 + for i in range(size-2, -1, -1): + # 以当前柱子为主心骨,向右迭代寻找次级柱子 + temp = i + 1 + while temp < size and heights[temp] >= heights[i]: + # 当右侧的柱子持续较高时,尝试这个高柱子自己的次级柱子(DP + temp = min_right_index[temp] + # 当找到右侧矮一级的目标柱子时 + min_right_index[i] = temp + + for i in range(size): + area = heights[i] * (min_right_index[i] - min_left_index[i] - 1) + result = max(area, result) + return result + +# 单调栈 +class Solution: + def largestRectangleArea(self, heights: List[int]) -> int: + # Monotonic Stack + ''' + 找每个柱子左右侧的第一个高度值小于该柱子的柱子 + 单调栈:栈顶到栈底:从大到小(每插入一个新的小数值时,都要弹出先前的大数值) + 栈顶,栈顶的下一个元素,即将入栈的元素:这三个元素组成了最大面积的高度和宽度 + 情况一:当前遍历的元素heights[i]大于栈顶元素的情况 + 情况二:当前遍历的元素heights[i]等于栈顶元素的情况 + 情况三:当前遍历的元素heights[i]小于栈顶元素的情况 + ''' + + # 输入数组首尾各补上一个0(与42.接雨水不同的是,本题原首尾的两个柱子可以作为核心柱进行最大面积尝试 + heights.insert(0, 0) + heights.append(0) + stack = [0] + result = 0 + for i in range(1, len(heights)): + # 情况一 + if heights[i] > heights[stack[-1]]: + stack.append(i) + # 情况二 + elif heights[i] == heights[stack[-1]]: + stack.pop() + stack.append(i) + # 情况三 + else: + # 抛出所有较高的柱子 + while stack and heights[i] < heights[stack[-1]]: + # 栈顶就是中间的柱子,主心骨 + mid_index = stack[-1] + stack.pop() + if stack: + left_index = stack[-1] + right_index = i + width = right_index - left_index - 1 + height = heights[mid_index] + result = max(result, width * height) + stack.append(i) + return result + +# 单调栈精简 +class Solution: + def largestRectangleArea(self, heights: List[int]) -> int: + heights.insert(0, 0) + heights.append(0) + stack = [0] + result = 0 + for i in range(1, len(heights)): + while stack and heights[i] < heights[stack[-1]]: + mid_height = heights[stack[-1]] + stack.pop() + if stack: + # area = width * height + area = (i - stack[-1] - 1) * mid_height + result = max(area, result) + stack.append(i) + return result + + + + + ``` +***** JavaScript: ```javascript From 3c3f8a883e6456c54e3dda207ba91aec1b9f61a6 Mon Sep 17 00:00:00 2001 From: 0x404 <871206929@qq.com> Date: Fri, 1 Oct 2021 13:51:39 +0800 Subject: [PATCH 154/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E376.=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0376.摆动序列.md | 66 +++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index 23348bd0..7da39526 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -33,8 +33,7 @@ 输入: [1,2,3,4,5,6,7,8,9] 输出: 2 - -## 思路 +## 思路1(贪心解法) 本题要求通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。 @@ -93,6 +92,69 @@ public: 时间复杂度O(n) 空间复杂度O(1) +## 思路2(动态规划) + +考虑用动态规划的思想来解决这个问题。 + +很容易可以发现,对于我们当前考虑的这个数,要么是作为山峰(即nums[i] > nums[i-1]),要么是作为山谷(即nums[i] < nums[i - 1])。 + +* 设dp状态`dp[i][0]`,表示考虑前i个数,第i个数作为山峰的摆动子序列的最长长度 +* 设dp状态`dp[i][1]`,表示考虑前i个数,第i个数作为山谷的摆动子序列的最长长度 + +则转移方程为: + +* `dp[i][0] = max(dp[i][0], dp[j][1] + 1)`,其中`0 < j < i`且`nums[j] < nums[i]`,表示将nums[i]接到前面某个山谷后面,作为山峰。 +* `dp[i][1] = max(dp[i][1], dp[j][0] + 1)`,其中`0 < j < i`且`nums[j] > nums[i]`,表示将nums[i]接到前面某个山峰后面,作为山谷。 + +初始状态: + +由于一个数可以接到前面的某个数后面,也可以以自身为子序列的起点,所以初始状态为:`dp[0][0] = dp[0][1] = 1`。 + +C++代码如下: + +```c++ +class Solution { +public: + int dp[1005][2]; + int wiggleMaxLength(vector& nums) { + memset(dp, 0, sizeof dp); + dp[0][0] = dp[0][1] = 1; + + for (int i = 1; i < nums.size(); ++i) + { + dp[i][0] = dp[i][1] = 1; + + for (int j = 0; j < i; ++j) + { + if (nums[j] > nums[i]) dp[i][1] = max(dp[i][1], dp[j][0] + 1); + } + + for (int j = 0; j < i; ++j) + { + if (nums[j] < nums[i]) dp[i][0] = max(dp[i][0], dp[j][1] + 1); + } + } + return max(dp[nums.size() - 1][0], dp[nums.size() - 1][1]); + } +}; +``` + +时间复杂度O(n^2) + +空间复杂度O(n) + +**进阶** + +可以用两棵线段树来维护区间的最大值 + +* 每次更新`dp[i][0]`,则在`tree1`的`nums[i]`位置值更新为`dp[i][0]` +* 每次更新`dp[i][1]`,则在`tree2`的`nums[i]`位置值更新为`dp[i][1]` +* 则dp转移方程中就没有必要j从0遍历到i-1,可以直接在线段树中查询指定区间的值即可。 + +时间复杂度O(nlogn) + +空间复杂度O(n) + ## 总结 **贪心的题目说简单有的时候就是常识,说难就难在都不知道该怎么用贪心**。 From b8f4d4f6c987b778f1580dc0c3ef799a5dfe205b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Fri, 1 Oct 2021 19:05:09 +0800 Subject: [PATCH 155/222] =?UTF-8?q?Update=20=E6=95=B0=E7=BB=84=E6=80=BB?= =?UTF-8?q?=E7=BB=93=E7=AF=87.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/数组总结篇.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md index 528904c2..aa2ae5fb 100644 --- a/problems/数组总结篇.md +++ b/problems/数组总结篇.md @@ -51,7 +51,7 @@ -所以**二维数据在内存中不是 `3*4` 的连续地址空间,而是三条连续的地址空间组成!** +所以**二维数据在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!** # 数组的经典题目 From 78225288cf29223a5e2c7563a0a2cfa72da3fb6f Mon Sep 17 00:00:00 2001 From: hailincai Date: Fri, 1 Oct 2021 14:16:45 -0400 Subject: [PATCH 156/222] =?UTF-8?q?=E5=A2=9E=E5=8A=A0java=E7=89=88?= =?UTF-8?q?=E6=9C=AC---=E5=88=86=E5=89=B2=E5=B9=B3=E8=A1=A1=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add java implementation --- problems/1221.分割平衡字符串.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/problems/1221.分割平衡字符串.md b/problems/1221.分割平衡字符串.md index cec49d0b..bc1f1fc4 100644 --- a/problems/1221.分割平衡字符串.md +++ b/problems/1221.分割平衡字符串.md @@ -93,6 +93,18 @@ public: ## Java ```java +class Solution { + public int balancedStringSplit(String s) { + int result = 0; + int count = 0; + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == 'R') count++; + else count--; + if (count == 0) result++; + } + return result; + } +} ``` ## Python From dd21fc7a11715bccaeb7f6da11a4bec4016ecf6e Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 2 Oct 2021 10:29:57 +0800 Subject: [PATCH 157/222] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=200376=20=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97=20JavaScript=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=8C=BA=E9=97=B4=E9=94=99=E8=AF=AF=20?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原代码中 存在 区间超出范围问题, 现给出修改方案 --- problems/0376.摆动序列.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index 23348bd0..82b67451 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -177,7 +177,7 @@ var wiggleMaxLength = function(nums) { let result = 1 let preDiff = 0 let curDiff = 0 - for(let i = 0; i <= nums.length; i++) { + for(let i = 0; i < nums.length - 1; i++) { curDiff = nums[i + 1] - nums[i] if((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) { result++ From 0b48719c49b6184eac214d80a08a7556238038e5 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 2 Oct 2021 13:47:57 +0800 Subject: [PATCH 158/222] =?UTF-8?q?=E8=A7=A3=E5=86=B3=200435=20=E6=97=A0?= =?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4=20C++=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0435.无重叠区间.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index 79083716..830f0c7e 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -72,7 +72,7 @@ C++代码如下: -``` +```c++ class Solution { public: // 按照区间右边界排序 From ef2eb4b47ab282737b8344bb4837aeb5b066dbcf Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 2 Oct 2021 14:02:38 +0800 Subject: [PATCH 159/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200056=20=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=8C=BA=E9=97=B4=20JavaScript=20=E5=8F=A6=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0056.合并区间.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/0056.合并区间.md b/problems/0056.合并区间.md index 93c0a2a0..fd914497 100644 --- a/problems/0056.合并区间.md +++ b/problems/0056.合并区间.md @@ -241,6 +241,32 @@ var merge = function (intervals) { return result }; ``` +版本二:左右区间 +```javascript +/** + * @param {number[][]} intervals + * @return {number[][]} + */ +var merge = function(intervals) { + let n = intervals.length; + if ( n < 2) return intervals; + intervals.sort((a, b) => a[0]- b[0]); + let res = [], + left = intervals[0][0], + right = intervals[0][1]; + for (let i = 1; i < n; i++) { + if (intervals[i][0] > right) { + res.push([left, right]); + left = intervals[i][0]; + right = intervals[i][1]; + } else { + right = Math.max(intervals[i][1], right); + } + } + res.push([left, right]); + return res; +}; +``` From ee3e483505af9c53fb1e374bd0de9647f6e9b729 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sat, 2 Oct 2021 14:19:52 +0800 Subject: [PATCH 160/222] =?UTF-8?q?=E8=A1=A5=E5=85=85=200714=20=E4=B9=B0?= =?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=20JavaScript=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=20=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...买卖股票的最佳时机含手续费.md | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md index c6a147b4..576f5f85 100644 --- a/problems/0714.买卖股票的最佳时机含手续费.md +++ b/problems/0714.买卖股票的最佳时机含手续费.md @@ -262,6 +262,34 @@ var maxProfit = function(prices, fee) { } return result }; + +// 动态规划 +/** + * @param {number[]} prices + * @param {number} fee + * @return {number} + */ +var maxProfit = function(prices, fee) { + // 滚动数组 + // have表示当天持有股票的最大收益 + // notHave表示当天不持有股票的最大收益 + // 把手续费算在买入价格中 + let n = prices.length, + have = -prices[0]-fee, // 第0天持有股票的最大收益 + notHave = 0; // 第0天不持有股票的最大收益 + for (let i = 1; i < n; i++) { + // 第i天持有股票的最大收益由两种情况组成 + // 1、第i-1天就已经持有股票,第i天什么也没做 + // 2、第i-1天不持有股票,第i天刚买入 + have = Math.max(have, notHave - prices[i] - fee); + // 第i天不持有股票的最大收益由两种情况组成 + // 1、第i-1天就已经不持有股票,第i天什么也没做 + // 2、第i-1天持有股票,第i天刚卖出 + notHave = Math.max(notHave, have + prices[i]); + } + // 最后手中不持有股票,收益才能最大化 + return notHave; +}; ``` From 35d30c93dd7c18893c77f96b9c1daa6b58649ac3 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sun, 3 Oct 2021 10:33:51 +0800 Subject: [PATCH 161/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200062=20=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84=20JavaScript=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E5=8F=A6=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 我认为将dp数组的值全部初始化为1是可以的,因为由状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1] 可知,当前dp[i][j]的值与其自身的原始值并无联系。所有将dp的所有值都初始化为1,可以减少代码量,同时也不会影响代码的整体思路。 --- problems/0062.不同路径.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/problems/0062.不同路径.md b/problems/0062.不同路径.md index af3a8f40..31896fd1 100644 --- a/problems/0062.不同路径.md +++ b/problems/0062.不同路径.md @@ -327,6 +327,25 @@ var uniquePaths = function(m, n) { return dp[m - 1][n - 1] }; ``` +>版本二:直接将dp数值值初始化为1 +```javascript +/** + * @param {number} m + * @param {number} n + * @return {number} + */ +var uniquePaths = function(m, n) { + let dp = new Array(m).fill(1).map(() => new Array(n).fill(1)); + // dp[i][j] 表示到达(i,j) 点的路径数 + for (let i=1; i Date: Sun, 3 Oct 2021 18:59:22 +0800 Subject: [PATCH 162/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200206.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8.md=20=E6=B7=BB=E5=8A=A0=E9=80=92?= =?UTF-8?q?=E5=BD=92=E8=A7=A3=E6=B3=95=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0206.翻转链表.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index ef2664eb..0a8b3622 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -96,6 +96,26 @@ public: }; ``` +我们可以发现,上面的递归写法和双指针法实质上都是从前往后翻转指针指向,其实还有另外一种与双指针法不同思路的递归写法:从后往前翻转指针指向。 + +具体代码如下(带详细注释): + +```c++ +class Solution { +public: + ListNode* reverseList(ListNode* head) { + // 如果链表只有一个节点,返回自身 + if (head->next == NULL) return head; + // 递归调用,翻转第二个节点开始往后的链表 + ListNode *last = reverseList(head->next); + // 翻转头节点与第二个节点的指向 + head->next->next = head; + // 此时的 head 节点为尾节点,next 需要指向 NULL + head->next = NULL; + return last; + } +}; +``` ## 其他语言版本 From 8b6346c4e8d02a68f953a9f350376d68ac9d42eb Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Sun, 3 Oct 2021 19:07:45 +0800 Subject: [PATCH 163/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200206.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8.md=20=E4=BF=AE=E5=A4=8DJava?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E9=80=92=E5=BD=92=E5=86=99=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0206.翻转链表.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index 0a8b3622..4e450a1b 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -155,9 +155,9 @@ class Solution { temp = cur.next;// 先保存下一个节点 cur.next = prev;// 反转 // 更新prev、cur位置 - prev = cur; - cur = temp; - return reverse(prev, cur); + // prev = cur; + // cur = temp; + return reverse(cur, temp); } } ``` From 0ff89f039dd1b6444e4f0ae0d3fd0477ab271812 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 3 Oct 2021 19:19:31 +0800 Subject: [PATCH 164/222] =?UTF-8?q?Update=200110.=E5=B9=B3=E8=A1=A1?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 纠正笔误深度和高度 --- problems/0110.平衡二叉树.md | 100 ++++++++++++++++++------------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index 7858fa60..41cf1ef7 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -125,9 +125,10 @@ public: 1. 明确递归函数的参数和返回值 -参数的话为传入的节点指针,就没有其他参数需要传递了,返回值要返回传入节点为根节点树的深度。 +参数:当前传入节点。 +返回值:以当前传入节点为根节点的树的高度。 -那么如何标记左右子树是否差值大于1呢。 +那么如何标记左右子树是否差值大于1呢? 如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。 @@ -136,9 +137,9 @@ public: 代码如下: -``` +```CPP // -1 表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度 -int getDepth(TreeNode* node) +int getHeight(TreeNode* node) ``` 2. 明确终止条件 @@ -147,7 +148,7 @@ int getDepth(TreeNode* node) 代码如下: -``` +```CPP if (node == NULL) { return 0; } @@ -155,23 +156,23 @@ if (node == NULL) { 3. 明确单层递归的逻辑 -如何判断当前传入节点为根节点的二叉树是否是平衡二叉树呢,当然是左子树高度和右子树高度相差。 +如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。 -分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉树了。 +分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉平衡树了。 代码如下: ```CPP -int leftDepth = depth(node->left); // 左 -if (leftDepth == -1) return -1; -int rightDepth = depth(node->right); // 右 -if (rightDepth == -1) return -1; +int leftHeight = getHeight(node->left); // 左 +if (leftHeight == -1) return -1; +int rightHeight = getHeight(node->right); // 右 +if (rightHeight == -1) return -1; int result; -if (abs(leftDepth - rightDepth) > 1) { // 中 +if (abs(leftHeight - rightHeight) > 1) { // 中 result = -1; } else { - result = 1 + max(leftDepth, rightDepth); // 以当前节点为根节点的最大高度 + result = 1 + max(leftHeight, rightHeight); // 以当前节点为根节点的树的最大高度 } return result; @@ -180,27 +181,27 @@ return result; 代码精简之后如下: ```CPP -int leftDepth = getDepth(node->left); -if (leftDepth == -1) return -1; -int rightDepth = getDepth(node->right); -if (rightDepth == -1) return -1; -return abs(leftDepth - rightDepth) > 1 ? -1 : 1 + max(leftDepth, rightDepth); +int leftHeight = getHeight(node->left); +if (leftHeight == -1) return -1; +int rightHeight = getHeight(node->right); +if (rightHeight == -1) return -1; +return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight); ``` 此时递归的函数就已经写出来了,这个递归的函数传入节点指针,返回以该节点为根节点的二叉树的高度,如果不是二叉平衡树,则返回-1。 -getDepth整体代码如下: +getHeight整体代码如下: ```CPP -int getDepth(TreeNode* node) { +int getHeight(TreeNode* node) { if (node == NULL) { return 0; } - int leftDepth = getDepth(node->left); - if (leftDepth == -1) return -1; - int rightDepth = getDepth(node->right); - if (rightDepth == -1) return -1; - return abs(leftDepth - rightDepth) > 1 ? -1 : 1 + max(leftDepth, rightDepth); + int leftHeight = getHeight(node->left); + if (leftHeight == -1) return -1; + int rightHeight = getHeight(node->right); + if (rightHeight == -1) return -1; + return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight); } ``` @@ -210,18 +211,18 @@ int getDepth(TreeNode* node) { class Solution { public: // 返回以该节点为根节点的二叉树的高度,如果不是二叉搜索树了则返回-1 - int getDepth(TreeNode* node) { + int getHeight(TreeNode* node) { if (node == NULL) { return 0; } - int leftDepth = getDepth(node->left); - if (leftDepth == -1) return -1; // 说明左子树已经不是二叉平衡树 - int rightDepth = getDepth(node->right); - if (rightDepth == -1) return -1; // 说明右子树已经不是二叉平衡树 - return abs(leftDepth - rightDepth) > 1 ? -1 : 1 + max(leftDepth, rightDepth); + int leftHeight = getHeight(node->left); + if (leftHeight == -1) return -1; + int rightHeight = getHeight(node->right); + if (rightHeight == -1) return -1; + return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight); } bool isBalanced(TreeNode* root) { - return getDepth(root) == -1 ? false : true; + return getHeight(root) == -1 ? false : true; } }; ``` @@ -498,20 +499,35 @@ class Solution { ## Python 递归法: -```python +```python3 +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right class Solution: def isBalanced(self, root: TreeNode) -> bool: - return True if self.getDepth(root) != -1 else False + if self.get_height(root) != -1: + return True + else: + return False - #返回以该节点为根节点的二叉树的高度,如果不是二叉搜索树了则返回-1 - def getDepth(self, node): - if not node: + def get_height(self, root: TreeNode) -> int: + # Base Case + if not root: return 0 - leftDepth = self.getDepth(node.left) - if leftDepth == -1: return -1 #说明左子树已经不是二叉平衡树 - rightDepth = self.getDepth(node.right) - if rightDepth == -1: return -1 #说明右子树已经不是二叉平衡树 - return -1 if abs(leftDepth - rightDepth)>1 else 1 + max(leftDepth, rightDepth) + # 左 + if (left_height := self.get_height(root.left)) == -1: + return -1 + # 右 + if (right_height := self.get_height(root.right)) == -1: + return -1 + # 中 + if abs(left_height - right_height) > 1: + return -1 + else: + return 1 + max(left_height, right_height) ``` 迭代法: From dab89905adaac01f541ecb71f2a9e30980c88249 Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Sun, 3 Oct 2021 19:21:53 +0800 Subject: [PATCH 165/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200206.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8.md=20=E6=B7=BB=E5=8A=A0=E9=80=92?= =?UTF-8?q?=E5=BD=92=E8=A7=A3=E6=B3=95=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0206.翻转链表.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index 4e450a1b..0c35f7d7 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -104,8 +104,10 @@ public: class Solution { public: ListNode* reverseList(ListNode* head) { - // 如果链表只有一个节点,返回自身 + // 边缘条件判断 + if(head == NULL) return NULL; if (head->next == NULL) return head; + // 递归调用,翻转第二个节点开始往后的链表 ListNode *last = reverseList(head->next); // 翻转头节点与第二个节点的指向 From f1aa928e1cc8349a26b3ceb37184a6216f272736 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 3 Oct 2021 20:09:23 +0800 Subject: [PATCH 166/222] =?UTF-8?q?Update=200257.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF=E5=BE=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修订python3语法规范lint --- problems/0257.二叉树的所有路径.md | 43 ++++++++++++++--------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index c85186d5..f902aab2 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -404,33 +404,41 @@ class Solution { } } ``` - -Python: -```Python +--- +Python: +递归法+隐形回溯 +```Python3 +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right class Solution: - """二叉树的所有路径 递归法""" - def binaryTreePaths(self, root: TreeNode) -> List[str]: - path, result = '', [] + path = '' + result = [] + if not root: return result self.traversal(root, path, result) return result - def traversal(self, cur: TreeNode, path: List, result: List): + def traversal(self, cur: TreeNode, path: str, result: List[str]) -> None: path += str(cur.val) - # 如果当前节点为叶子节点,添加路径到结果中 - if not (cur.left or cur.right): + # 若当前节点为leave,直接输出 + if not cur.left and not cur.right: result.append(path) - return - + if cur.left: + # + '->' 是隐藏回溯 self.traversal(cur.left, path + '->', result) - + if cur.right: self.traversal(cur.right, path + '->', result) - ``` - -```python + +迭代法: + +```python3 from collections import deque @@ -457,7 +465,8 @@ class Solution: return result ``` - + +--- Go: ```go @@ -482,7 +491,7 @@ func binaryTreePaths(root *TreeNode) []string { return res } ``` - +--- JavaScript: 1.递归版本 From 5570ce5aafad0583fab8dc5e0b77c824870a557b Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 4 Oct 2021 09:05:35 +0800 Subject: [PATCH 167/222] =?UTF-8?q?=E8=A7=A3=E5=86=B3=200416=20=E5=88=86?= =?UTF-8?q?=E5=89=B2=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86=20Go=20=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=89=88=E6=9C=AC=E4=BB=A3=E7=A0=81=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0416.分割等和子集.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index fd20f68a..05c272c6 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -227,7 +227,7 @@ class Solution: ``` Go: -``` +```go func canPartition(nums []int) bool { /** 动态五部曲: From af819a97267fdf154dea9367425efddfce793757 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 4 Oct 2021 09:21:46 +0800 Subject: [PATCH 168/222] =?UTF-8?q?=E5=88=A0=E9=99=A4=200494=20=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E5=92=8C=20JavaScript=E7=89=88=E6=9C=AC=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=AD=E7=9A=84=E6=8E=92=E5=BA=8F=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对原数组升序排序是没有必要的 --- problems/0494.目标和.md | 1 - 1 file changed, 1 deletion(-) diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 210ac749..00771c22 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -371,7 +371,6 @@ const findTargetSumWays = (nums, target) => { } const halfSum = (target + sum) / 2; - nums.sort((a, b) => a - b); let dp = new Array(halfSum+1).fill(0); dp[0] = 1; From 5ecfb3aaca49e37520f53249028a8fcf324a1a7f Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 4 Oct 2021 09:43:48 +0800 Subject: [PATCH 169/222] =?UTF-8?q?=E8=A7=A3=E5=86=B3=200070=20=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF=20c++=E4=BB=A3=E7=A0=81=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0070.爬楼梯完全背包版本.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0070.爬楼梯完全背包版本.md b/problems/0070.爬楼梯完全背包版本.md index 104b2d5a..3851e7a5 100644 --- a/problems/0070.爬楼梯完全背包版本.md +++ b/problems/0070.爬楼梯完全背包版本.md @@ -88,7 +88,7 @@ 以上分析完毕,C++代码如下: -``` +```c++ class Solution { public: int climbStairs(int n) { From 7ef3bea8998dcacb9b3ca643de0351f137b67b8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Mon, 4 Oct 2021 09:50:16 +0800 Subject: [PATCH 170/222] =?UTF-8?q?Update=200435.=E6=97=A0=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0435.无重叠区间.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index 830f0c7e..2bf1f4b0 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -72,7 +72,7 @@ C++代码如下: -```c++ +```CPP class Solution { public: // 按照区间右边界排序 From 78efc0ab870f97f015a7babefad86092624889aa Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 4 Oct 2021 09:55:01 +0800 Subject: [PATCH 171/222] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=200279=20=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E5=B9=B3=E6=96=B9=E6=95=B0=20JavaScript=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 首先 0 不是题目中所说的完全平方数,所有 i 的范围应该从 1 开始; 其次,i <= n 不太合理,增加了大量无用计算,应改成 i**2 (即 i^2)<= n 更为合适 --- problems/0279.完全平方数.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/0279.完全平方数.md b/problems/0279.完全平方数.md index a00ed47e..b1af7e95 100644 --- a/problems/0279.完全平方数.md +++ b/problems/0279.完全平方数.md @@ -334,8 +334,8 @@ var numSquares1 = function(n) { let dp = new Array(n + 1).fill(Infinity) dp[0] = 0 - for(let i = 0; i <= n; i++) { - let val = i * i + for(let i = 1; i**2 <= n; i++) { + let val = i**2 for(let j = val; j <= n; j++) { dp[j] = Math.min(dp[j], dp[j - val] + 1) } From 7b6fd761297d0d90c80180e8dcce17feff9c3483 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Mon, 4 Oct 2021 18:25:43 +0800 Subject: [PATCH 172/222] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E4=B8=AD=E9=80=92=E5=BD=92=E5=B8=A6=E7=9D=80=E5=9B=9E=E6=BA=AF?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 进一步探讨左右子树情况 --- problems/二叉树中递归带着回溯.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/problems/二叉树中递归带着回溯.md b/problems/二叉树中递归带着回溯.md index 71a3ee5c..0a386fe1 100644 --- a/problems/二叉树中递归带着回溯.md +++ b/problems/二叉树中递归带着回溯.md @@ -145,22 +145,22 @@ if (cur->right) { } ``` -此时就没有回溯了,这个代码就是通过不了的了。 +因为在递归右子树之前需要还原path,所以在左子树递归后必须为了右子树而进行回溯操作。而只右子树自己不添加回溯也可以成功AC。 -如果想把回溯加上,就要 在上面代码的基础上,加上回溯,就可以AC了。 +因此,在上面代码的基础上,再加上左右子树的回溯代码,就可以AC了。 ```CPP if (cur->left) { path += "->"; traversal(cur->left, path, result); // 左 - path.pop_back(); // 回溯 - path.pop_back(); + path.pop_back(); // 回溯,抛掉val + path.pop_back(); // 回溯,抛掉-> } if (cur->right) { path += "->"; traversal(cur->right, path, result); // 右 - path.pop_back(); // 回溯 - path.pop_back(); + path.pop_back(); // 回溯(非必要) + path.pop_back(); } ``` From b4e21799796b4b60fe0a777761aa7d1f1ef94f1b Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Mon, 4 Oct 2021 19:25:58 +0800 Subject: [PATCH 173/222] =?UTF-8?q?Update=200404.=E5=B7=A6=E5=8F=B6?= =?UTF-8?q?=E5=AD=90=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 进一步讨论迭代顺序可能性,实际提交显示前序遍历和后序遍历同样可以AC --- problems/0404.左叶子之和.md | 37 +++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index e55981e2..19149285 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -42,7 +42,7 @@ if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) ## 递归法 -递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。。 +递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。(前序遍历其实也同样AC) 递归三部曲: @@ -230,8 +230,8 @@ class Solution { ## Python -**递归** -```python +> 递归后序遍历 +```python3 class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: if not root: @@ -246,9 +246,36 @@ class Solution: return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum ``` +> 递归前序遍历 +```python3 +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def sumOfLeftLeaves(self, root: TreeNode) -> int: + # 需要通过中节点来判断其的左节点是否存在;左节点自己的左右节点也是否存在 -**迭代** -```python + if not root: return 0 + + # 初始化left_leaf备用 + left_leaf = 0 + # 若当前节点的左孩子就是左叶子 + if root.left and not root.left.left and not root.left.right: + left_leaf = root.left.val + + left_left_leaves_sum = self.sumOfLeftLeaves(root.left) + right_left_leaves_sum = self.sumOfLeftLeaves(root.right) + + + return left_leaf + left_left_leaves_sum + right_left_leaves_sum +``` + + +> 迭代 +```python3 class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: """ From abd3358314f9580a5a43540c22aa861cb20f0105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Tue, 5 Oct 2021 14:21:08 +0800 Subject: [PATCH 174/222] =?UTF-8?q?Update=200206.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E9=93=BE=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0206.翻转链表.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index 0c35f7d7..ec6f3dca 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -100,7 +100,7 @@ public: 具体代码如下(带详细注释): -```c++ +```CPP class Solution { public: ListNode* reverseList(ListNode* head) { From 7f051a4dfb160d4aa77e5aaf0768fc05cd7a95aa Mon Sep 17 00:00:00 2001 From: DoubleYellowIce <65336599+DoubleYellowIce@users.noreply.github.com> Date: Tue, 5 Oct 2021 15:29:06 +0800 Subject: [PATCH 175/222] =?UTF-8?q?Update=200738.=E5=8D=95=E8=B0=83?= =?UTF-8?q?=E9=80=92=E5=A2=9E=E7=9A=84=E6=95=B0=E5=AD=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit java原先版本中创建了String数组,多次使用Integer.parseInt了方法,这导致不管是耗时还是空间占用都非常高,用时12ms,下面提供一个版本在char数组上原地修改,用时1ms的版本 --- problems/0738.单调递增的数字.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md index 0db0db15..61175521 100644 --- a/problems/0738.单调递增的数字.md +++ b/problems/0738.单调递增的数字.md @@ -127,6 +127,7 @@ public: Java: ```java +版本1 class Solution { public int monotoneIncreasingDigits(int N) { String[] strings = (N + "").split(""); @@ -144,6 +145,31 @@ class Solution { } } ``` +java版本1中创建了String数组,多次使用Integer.parseInt了方法,这导致不管是耗时还是空间占用都非常高,用时12ms,下面提供一个版本在char数组上原地修改,用时1ms的版本 +```java +版本2 +class Solution { + public int monotoneIncreasingDigits(int n) { + if (n==0)return 0; + char[] chars= Integer.toString(n).toCharArray(); + int start=Integer.MAX_VALUE;//start初始值设为最大值,这是为了防止当数字本身是单调递增时,没有一位数字需要改成9的情况 + for (int i=chars.length-1;i>0;i--){ + if (chars[i]=start){ + res.append('9'); + }else res.append(chars[i]); + } + return Integer.parseInt(res.toString()); + } +} +``` Python: From c97ef2dad03d83f1711111d644dafbda3a548602 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Wed, 6 Oct 2021 09:58:52 +0800 Subject: [PATCH 176/222] =?UTF-8?q?=E8=A7=A3=E5=86=B30392=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=AD=90=E5=BA=8F=E5=88=97=20Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=97=A0=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0392.判断子序列.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0392.判断子序列.md b/problems/0392.判断子序列.md index cda0c82d..1a8e55fa 100644 --- a/problems/0392.判断子序列.md +++ b/problems/0392.判断子序列.md @@ -141,7 +141,7 @@ public: Java: -``` +```java class Solution { public boolean isSubsequence(String s, String t) { int length1 = s.length(); int length2 = t.length(); From 8a35685b3f030672b1cd71d2ad9f357a1d60093a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Wed, 6 Oct 2021 16:19:22 +0800 Subject: [PATCH 177/222] =?UTF-8?q?Update=200070.=E7=88=AC=E6=A5=BC?= =?UTF-8?q?=E6=A2=AF=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85=E7=89=88=E6=9C=AC?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0070.爬楼梯完全背包版本.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0070.爬楼梯完全背包版本.md b/problems/0070.爬楼梯完全背包版本.md index 3851e7a5..02c995c3 100644 --- a/problems/0070.爬楼梯完全背包版本.md +++ b/problems/0070.爬楼梯完全背包版本.md @@ -88,7 +88,7 @@ 以上分析完毕,C++代码如下: -```c++ +```CPP class Solution { public: int climbStairs(int n) { From 970a441f1034e7c65881c4867d03de300776589f Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Thu, 7 Oct 2021 19:29:26 +0800 Subject: [PATCH 178/222] =?UTF-8?q?Update=200501.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E4=BC=97=E6=95=B0?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 规范Python3代码 --- problems/0501.二叉搜索树中的众数.md | 68 ++++++++++++-------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md index 29e5e139..18d9b290 100644 --- a/problems/0501.二叉搜索树中的众数.md +++ b/problems/0501.二叉搜索树中的众数.md @@ -470,38 +470,54 @@ class Solution { ## Python -递归法 +> 递归法 -```python +```python3 +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right class Solution: + def __init__(self): + self.pre = TreeNode() + self.count = 0 + self.max_count = 0 + self.result = [] + def findMode(self, root: TreeNode) -> List[int]: - if not root: return - self.pre = root - self.count = 0 //统计频率 - self.countMax = 0 //最大频率 - self.res = [] - def findNumber(root): - if not root: return None // 第一个节点 - findNumber(root.left) //左 - if self.pre.val == root.val: //中: 与前一个节点数值相同 - self.count += 1 - else: // 与前一个节点数值不同 - self.pre = root - self.count = 1 - if self.count > self.countMax: // 如果计数大于最大值频率 - self.countMax = self.count // 更新最大频率 - self.res = [root.val] //更新res - elif self.count == self.countMax: // 如果和最大值相同,放进res中 - self.res.append(root.val) - findNumber(root.right) //右 - return - findNumber(root) - return self.res + if not root: return None + self.search_BST(root) + return self.result + + def search_BST(self, cur: TreeNode) -> None: + if not cur: return None + self.search_BST(cur.left) + # 第一个节点 + if not self.pre: + self.count = 1 + # 与前一个节点数值相同 + elif self.pre.val == cur.val: + self.count += 1 + # 与前一个节点数值不相同 + else: + self.count = 1 + self.pre = cur + + if self.count == self.max_count: + self.result.append(cur.val) + + if self.count > self.max_count: + self.max_count = self.count + self.result = [cur.val] # 清空self.result,确保result之前的的元素都失效 + + self.search_BST(cur.right) ``` -迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性 -```python +> 迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性 +```python3 class Solution: def findMode(self, root: TreeNode) -> List[int]: stack = [] From 42924684ee95003d0f21a80662886f2e88d147ec Mon Sep 17 00:00:00 2001 From: lfeng Date: Fri, 8 Oct 2021 10:10:48 +0800 Subject: [PATCH 179/222] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strStr.?= =?UTF-8?q?md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0028.实现strStr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index 2a7b9cfa..1c200a71 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -215,7 +215,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 其实**这并不涉及到KMP的原理,而是具体实现,next数组即可以就是前缀表,也可以是前缀表统一减一(右移一位,初始位置为-1)。** -后面我会提供两种不同的实现代码,大家就明白了了。 +后面我会提供两种不同的实现代码,大家就明白了。 # 使用next数组来匹配 From 9badd38a38a0cccd26cc8c0ef6f0ac732a1c2df5 Mon Sep 17 00:00:00 2001 From: lfeng Date: Fri, 8 Oct 2021 10:11:31 +0800 Subject: [PATCH 180/222] =?UTF-8?q?Update=200042.=E6=8E=A5=E9=9B=A8?= =?UTF-8?q?=E6=B0=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0042.接雨水.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index bc397863..25899e38 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -204,7 +204,7 @@ public: 2. 使用单调栈内元素的顺序 -从大到小还是从小打到呢? +从大到小还是从小到大呢? 从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。 From ff7c57a7d00eff78570847e5f8e487c627c8f766 Mon Sep 17 00:00:00 2001 From: lfeng Date: Fri, 8 Oct 2021 10:12:08 +0800 Subject: [PATCH 181/222] =?UTF-8?q?Update=200225.=E7=94=A8=E9=98=9F?= =?UTF-8?q?=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0225.用队列实现栈.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md index 5adba07f..d9819626 100644 --- a/problems/0225.用队列实现栈.md +++ b/problems/0225.用队列实现栈.md @@ -112,7 +112,7 @@ public: # 优化 -其实这道题目就是用一个队里就够了。 +其实这道题目就是用一个队列就够了。 **一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。** From 5e5b3d5f4c926e80e3bad9916f9d13264ff45082 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Fri, 8 Oct 2021 13:12:08 +0800 Subject: [PATCH 182/222] =?UTF-8?q?Update=200404.=E5=B7=A6=E5=8F=B6?= =?UTF-8?q?=E5=AD=90=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 勘误python注释 --- problems/0404.左叶子之和.md | 35 ++++---------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index 19149285..fb574794 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -171,10 +171,10 @@ class Solution { int rightValue = sumOfLeftLeaves(root.right); // 右 int midValue = 0; - if (root.left != null && root.left.left == null && root.left.right == null) { // 中 + if (root.left != null && root.left.left == null && root.left.right == null) { midValue = root.left.val; } - int sum = midValue + leftValue + rightValue; + int sum = midValue + leftValue + rightValue; // 中 return sum; } } @@ -242,37 +242,10 @@ class Solution: cur_left_leaf_val = 0 if root.left and not root.left.left and not root.left.right: - cur_left_leaf_val = root.left.val # 中 + cur_left_leaf_val = root.left.val - return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum + return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum # 中 ``` -> 递归前序遍历 -```python3 -# Definition for a binary tree node. -# class TreeNode: -# def __init__(self, val=0, left=None, right=None): -# self.val = val -# self.left = left -# self.right = right -class Solution: - def sumOfLeftLeaves(self, root: TreeNode) -> int: - # 需要通过中节点来判断其的左节点是否存在;左节点自己的左右节点也是否存在 - - if not root: return 0 - - # 初始化left_leaf备用 - left_leaf = 0 - # 若当前节点的左孩子就是左叶子 - if root.left and not root.left.left and not root.left.right: - left_leaf = root.left.val - - left_left_leaves_sum = self.sumOfLeftLeaves(root.left) - right_left_leaves_sum = self.sumOfLeftLeaves(root.right) - - - return left_leaf + left_left_leaves_sum + right_left_leaves_sum -``` - > 迭代 ```python3 From d131731015f2184cb4ffb428bf414e258225fd61 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Fri, 8 Oct 2021 13:15:58 +0800 Subject: [PATCH 183/222] =?UTF-8?q?Update=200404.=E5=B7=A6=E5=8F=B6?= =?UTF-8?q?=E5=AD=90=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 勘误python注释 --- problems/0404.左叶子之和.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index fb574794..ffcd2c8c 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -42,7 +42,7 @@ if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) ## 递归法 -递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。(前序遍历其实也同样AC) +递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。。 递归三部曲: @@ -230,7 +230,7 @@ class Solution { ## Python -> 递归后序遍历 +**递归后序遍历** ```python3 class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: @@ -247,7 +247,7 @@ class Solution: return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum # 中 ``` -> 迭代 +**迭代** ```python3 class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: From cd1c56ae13b2126d6d0a0f6a09dc5c137aee50d9 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sat, 9 Oct 2021 15:06:36 +0800 Subject: [PATCH 184/222] =?UTF-8?q?Update=200701.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=8F=92=E5=85=A5?= =?UTF-8?q?=E6=93=8D=E4=BD=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python注释 --- .../0701.二叉搜索树中的插入操作.md | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/problems/0701.二叉搜索树中的插入操作.md b/problems/0701.二叉搜索树中的插入操作.md index 0d3d676b..2dca140a 100644 --- a/problems/0701.二叉搜索树中的插入操作.md +++ b/problems/0701.二叉搜索树中的插入操作.md @@ -253,21 +253,38 @@ class Solution { } } ``` - +----- ## Python **递归法** - 有返回值 ```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right class Solution: def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode: - if root is None: - return TreeNode(val) # 如果当前节点为空,也就意味着val找到了合适的位置,此时创建节点直接返回。 + # 返回更新后的以当前root为根节点的新树,方便用于更新上一层的父子节点关系链 + + # Base Case + if not root: return TreeNode(val) + + # 单层递归逻辑: + if val < root.val: + # 将val插入至当前root的左子树中合适的位置 + # 并更新当前root的左子树为包含目标val的新左子树 + root.left = self.insertIntoBST(root.left, val) + if root.val < val: - root.right = self.insertIntoBST(root.right, val) # 递归创建右子树 - if root.val > val: - root.left = self.insertIntoBST(root.left, val) # 递归创建左子树 - return root + # 将val插入至当前root的右子树中合适的位置 + # 并更新当前root的右子树为包含目标val的新右子树 + root.right = self.insertIntoBST(root.right, val) + + # 返回更新后的以当前root为根节点的新树 + return roo ``` **递归法** - 无返回值 @@ -328,7 +345,7 @@ class Solution: return root ``` - +----- ## Go 递归法 @@ -374,7 +391,7 @@ func insertIntoBST(root *TreeNode, val int) *TreeNode { return root } ``` - +----- ## JavaScript 有返回值的递归写法 From 9ba63ac729951639b17433f673c447a1d1185255 Mon Sep 17 00:00:00 2001 From: lfeng Date: Sat, 9 Oct 2021 15:46:44 +0800 Subject: [PATCH 185/222] =?UTF-8?q?Update=200042.=E6=8E=A5=E9=9B=A8?= =?UTF-8?q?=E6=B0=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0042.接雨水.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 25899e38..b75865d7 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -143,7 +143,7 @@ public: 当前列雨水面积:min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。 -为了的到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight)。这样就避免了重复计算,这就用到了动态规划。 +为了得到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight)。这样就避免了重复计算,这就用到了动态规划。 当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。 From 0d99a3975ee0f99130e8c32059d8b6ef258d9d56 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:52:14 +0800 Subject: [PATCH 186/222] =?UTF-8?q?Update=200669.=E4=BF=AE=E5=89=AA?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python注释 --- problems/0669.修剪二叉搜索树.md | 39 ++++++++++++++++++-------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/problems/0669.修剪二叉搜索树.md b/problems/0669.修剪二叉搜索树.md index 23269bb7..09a512c4 100644 --- a/problems/0669.修剪二叉搜索树.md +++ b/problems/0669.修剪二叉搜索树.md @@ -264,20 +264,37 @@ class Solution { ``` -## Python - +## Python +**递归** ```python3 - +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right class Solution: def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode: - if not root: return root - if root.val < low: - return self.trimBST(root.right,low,high) // 寻找符合区间[low, high]的节点 - if root.val > high: - return self.trimBST(root.left,low,high) // 寻找符合区间[low, high]的节点 - root.left = self.trimBST(root.left,low,high) // root->left接入符合条件的左孩子 - root.right = self.trimBST(root.right,low,high) // root->right接入符合条件的右孩子 - return root + ''' + 确认递归函数参数以及返回值:返回更新后剪枝后的当前root节点 + ''' + # Base Case + if not root: return None + + # 单层递归逻辑 + if root.val < low: + # 若当前root节点小于左界:只考虑其右子树,用于替代更新后的其本身,抛弃其左子树整体 + return self.trimBST(root.right, low, high) + + if high < root.val: + # 若当前root节点大于右界:只考虑其左子树,用于替代更新后的其本身,抛弃其右子树整体 + return self.trimBST(root.left, low, high) + + if low <= root.val <= high: + root.left = self.trimBST(root.left, low, high) + root.right = self.trimBST(root.right, low, high) + # 返回更新后的剪枝过的当前节点root + return root ``` ## Go From b314a3f3a53501860e68e861efb119e0567ad53a Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 10 Oct 2021 11:35:48 +0800 Subject: [PATCH 187/222] =?UTF-8?q?Update=200108.=E5=B0=86=E6=9C=89?= =?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E8=BD=AC=E6=8D=A2=E4=B8=BA=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python注释 --- ...将有序数组转换为二叉搜索树.md | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/problems/0108.将有序数组转换为二叉搜索树.md b/problems/0108.将有序数组转换为二叉搜索树.md index f2bfbb3b..e82d6e95 100644 --- a/problems/0108.将有序数组转换为二叉搜索树.md +++ b/problems/0108.将有序数组转换为二叉搜索树.md @@ -304,22 +304,42 @@ class Solution { } ``` -## Python +## Python +**递归** -递归法: ```python3 +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right class Solution: def sortedArrayToBST(self, nums: List[int]) -> TreeNode: - def buildaTree(left,right): - if left > right: return None #左闭右闭的区间,当区间 left > right的时候,就是空节点,当left = right的时候,不为空 - mid = left + (right - left) // 2 #保证数据不会越界 - val = nums[mid] - root = TreeNode(val) - root.left = buildaTree(left,mid - 1) - root.right = buildaTree(mid + 1,right) - return root - root = buildaTree(0,len(nums) - 1) #左闭右闭区间 + ''' + 构造二叉树:重点是选取数组最中间元素为分割点,左侧是递归左区间;右侧是递归右区间 + 必然是平衡树 + 左闭右闭区间 + ''' + # 返回根节点 + root = self.traversal(nums, 0, len(nums)-1) return root + + def traversal(self, nums: List[int], left: int, right: int) -> TreeNode: + # Base Case + if left > right: + return None + + # 确定左右界的中心,防越界 + mid = left + (right - left) // 2 + # 构建根节点 + mid_root = TreeNode(nums[mid]) + # 构建以左右界的中心为分割点的左右子树 + mid_root.left = self.traversal(nums, left, mid-1) + mid_root.right = self.traversal(nums, mid+1, right) + + # 返回由被传入的左右界定义的某子树的根节点 + return mid_root ``` ## Go From b38880b2fdd6f99312811e759a25082be0c48ef0 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 10 Oct 2021 12:26:42 +0800 Subject: [PATCH 188/222] =?UTF-8?q?Update=200538.=E6=8A=8A=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E8=BD=AC=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E7=B4=AF=E5=8A=A0=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python注释 --- ...38.把二叉搜索树转换为累加树.md | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/problems/0538.把二叉搜索树转换为累加树.md b/problems/0538.把二叉搜索树转换为累加树.md index f2b97989..6de98c6f 100644 --- a/problems/0538.把二叉搜索树转换为累加树.md +++ b/problems/0538.把二叉搜索树转换为累加树.md @@ -196,20 +196,40 @@ class Solution { ``` ## Python +**递归** -递归法 -```python +```python3 +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right class Solution: - def convertBST(self, root: TreeNode) -> TreeNode: - def buildalist(root): - if not root: return None - buildalist(root.right) #右中左遍历 - root.val += self.pre - self.pre = root.val - buildalist(root.left) - self.pre = 0 #记录前一个节点的数值 - buildalist(root) + def __init__(self): + self.pre = TreeNode() + + def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + ''' + 倒序累加替换: + [2, 5, 13] -> [[2]+[1]+[0], [2]+[1], [2]] -> [20, 18, 13] + ''' + self.traversal(root) return root + + def traversal(self, root: TreeNode) -> None: + # 因为要遍历整棵树,所以递归函数不需要返回值 + # Base Case + if not root: + return None + # 单层递归逻辑:中序遍历的反译 - 右中左 + self.traversal(root.right) # 右 + + # 中节点:用当前root的值加上pre的值 + root.val += self.pre.val # 中 + self.pre = root + + self.traversal(root.left) # 左 ``` ## Go From 9b6cc9a12e7104f76b67ffc11625f0e00e2251cf Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 10 Oct 2021 16:03:11 +0800 Subject: [PATCH 189/222] =?UTF-8?q?Update=200017.=E7=94=B5=E8=AF=9D?= =?UTF-8?q?=E5=8F=B7=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E7=BB=84=E5=90=88?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python注释规范格式 --- problems/0017.电话号码的字母组合.md | 117 ++++++++++--------- 1 file changed, 65 insertions(+), 52 deletions(-) diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md index 15a486f2..270398fb 100644 --- a/problems/0017.电话号码的字母组合.md +++ b/problems/0017.电话号码的字母组合.md @@ -282,61 +282,74 @@ class Solution { ``` ## Python - -```Python +**回溯** +```python3 class Solution: - ans = [] - s = '' - letterMap = { - '2': 'abc', - '3': 'def', - '4': 'ghi', - '5': 'jkl', - '6': 'mno', - '7': 'pqrs', - '8': 'tuv', - '9': 'wxyz' - } + def __init__(self): + self.answers: List[str] = [] + self.answer: str = '' + self.letter_map = { + '2': 'abc', + '3': 'def', + '4': 'ghi', + '5': 'jkl', + '6': 'mno', + '7': 'pqrs', + '8': 'tuv', + '9': 'wxyz' + } - def letterCombinations(self, digits): - self.ans.clear() - if digits == '': - return self.ans - self.backtracking(digits, 0) - return self.ans - - def backtracking(self, digits, index): - if index == len(digits): - self.ans.append(self.s) - return - else: - letters = self.letterMap[digits[index]] # 取出数字对应的字符集 - for letter in letters: - self.s = self.s + letter # 处理 - self.backtracking(digits, index + 1) - self.s = self.s[:-1] # 回溯 -``` - -python3: - -```py -class Solution: def letterCombinations(self, digits: str) -> List[str]: - res = [] - s = "" - letterMap = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"] - if not len(digits): return res - def backtrack(digits,index, s): - if index == len(digits): - return res.append(s) - digit = int(digits[index]) #将index指向的数字转为int - letters = letterMap[digit] #取数字对应的字符集 - for i in range(len(letters)): - s += letters[i] - backtrack(digits, index+1, s) #递归,注意index+1,一下层要处理下一个数字 - s = s[:-1] #回溯 - backtrack(digits, 0, s) - return res + self.answers.clear() + if not digits: return [] + self.backtracking(digits, 0) + return self.answers + + def backtracking(self, digits: str, index: int) -> None: + # 回溯函数没有返回值 + # Base Case + if index == len(digits): # 当遍历穷尽后的下一层时 + self.answers.append(self.answer) + return + # 单层递归逻辑 + letters: str = self.letter_map[digits[index]] + for letter in letters: + self.answer += letter # 处理 + self.backtracking(digits, index + 1) # 递归至下一层 + self.answer = self.answer[:-1] # 回溯 +``` +**回溯简化** +```python3 +class Solution: + def __init__(self): + self.answers: List[str] = [] + self.letter_map = { + '2': 'abc', + '3': 'def', + '4': 'ghi', + '5': 'jkl', + '6': 'mno', + '7': 'pqrs', + '8': 'tuv', + '9': 'wxyz' + } + + def letterCombinations(self, digits: str) -> List[str]: + self.answers.clear() + if not digits: return [] + self.backtracking(digits, 0, '') + return self.answers + + def backtracking(self, digits: str, index: int, answer: str) -> None: + # 回溯函数没有返回值 + # Base Case + if index == len(digits): # 当遍历穷尽后的下一层时 + self.answers.append(answer) + return + # 单层递归逻辑 + letters: str = self.letter_map[digits[index]] + for letter in letters: + self.backtracking(digits, index + 1, answer + letter) # 递归至下一层 + 回溯 ``` From da254e87ada310eb98a3d400bc2fc109ba3ef6c8 Mon Sep 17 00:00:00 2001 From: Vl_Coding_lover <1773279395@qq.com> Date: Sun, 10 Oct 2021 16:08:17 +0800 Subject: [PATCH 190/222] =?UTF-8?q?=E6=9B=B4=E6=96=B00121=20=E4=B9=B0?= =?UTF-8?q?=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E4=BA=86JS=E7=89=88=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E8=B4=AA=E5=BF=83=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第一次向卡哥的LeetCode-Master提交代码 激动.jpg! 对于这道题 第一次接触这道题的时候使用的暴力解一跑直接超时 后来看了题解中使用的贪心算法惊为天人 觉得好有道理!看到这道题里还没有 就加入了一下~希望以后可以为卡哥的项目共享更多代码! --- problems/0121.买卖股票的最佳时机.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/problems/0121.买卖股票的最佳时机.md b/problems/0121.买卖股票的最佳时机.md index e30fa50a..2f28cf1f 100644 --- a/problems/0121.买卖股票的最佳时机.md +++ b/problems/0121.买卖股票的最佳时机.md @@ -335,6 +335,8 @@ func max(a,b int)int { JavaScript: +> 动态规划 + ```javascript const maxProfit = prices => { const len = prices.length; @@ -353,7 +355,19 @@ const maxProfit = prices => { }; ``` +> 贪心法 +```javascript +var maxProfit = function(prices) { + let lowerPrice = prices[0];// 重点是维护这个最小值(贪心的思想) + let profit = 0; + for(let i = 0; i < prices.length; i++){ + lowerPrice = Math.min(lowerPrice, prices[i]);// 贪心地选择左面的最小价格 + profit = Math.max(profit, prices[i] - lowerPrice);// 遍历一趟就可以获得最大利润 + } + return profit; +}; +``` ----------------------- From 1c1b8cb84841780bef64f002a7cbc19dc52b697c Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 10 Oct 2021 16:57:27 +0800 Subject: [PATCH 191/222] =?UTF-8?q?Update=200039.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python代码和注释 --- problems/0039.组合总和.md | 80 ++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index e6f65700..4470c79e 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -264,25 +264,73 @@ class Solution { } ``` -## Python +## Python +**回溯** ```python3 class Solution: + def __init__(self): + self.path = [] + self.paths = [] + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: - res = [] - path = [] - def backtrack(candidates,target,sum,startIndex): - if sum > target: return - if sum == target: return res.append(path[:]) - for i in range(startIndex,len(candidates)): - if sum + candidates[i] >target: return #如果 sum + candidates[i] > target 就终止遍历 - sum += candidates[i] - path.append(candidates[i]) - backtrack(candidates,target,sum,i) #startIndex = i:表示可以重复读取当前的数 - sum -= candidates[i] #回溯 - path.pop() #回溯 - candidates = sorted(candidates) #需要排序 - backtrack(candidates,target,0,0) - return res + ''' + 因为本题没有组合数量限制,所以只要元素总和大于target就算结束 + ''' + self.path.clear() + self.paths.clear() + self.backtracking(candidates, target, 0, 0) + return self.paths + + def backtracking(self, candidates: List[int], target: int, sum_: int, start_index: int) -> None: + # Base Case + if sum_ == target: + self.paths.append(self.path[:]) # 因为是shallow copy,所以不能直接传入self.path + return + if sum_ > target: + return + + # 单层递归逻辑 + for i in range(start_index, len(candidates)): + sum_ += candidates[i] + self.path.append(candidates[i]) + self.backtracking(candidates, target, sum_, i) # 因为无限制重复选取,所以不是i-1 + sum_ -= candidates[i] # 回溯 + self.path.pop() # 回溯 +``` +**剪枝回溯** +```python3 +class Solution: + def __init__(self): + self.path = [] + self.paths = [] + + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: + ''' + 因为本题没有组合数量限制,所以只要元素总和大于target就算结束 + ''' + self.path.clear() + self.paths.clear() + + # 为了剪枝需要提前进行排序 + candidates.sort() + self.backtracking(candidates, target, 0, 0) + return self.paths + + def backtracking(self, candidates: List[int], target: int, sum_: int, start_index: int) -> None: + # Base Case + if sum_ == target: + self.paths.append(self.path[:]) # 因为是shallow copy,所以不能直接传入self.path + return + # 单层递归逻辑 + # 如果本层 sum + condidates[i] > target,就提前结束遍历,剪枝 + for i in range(start_index, len(candidates)): + if sum_ + candidates[i] > target: + return + sum_ += candidates[i] + self.path.append(candidates[i]) + self.backtracking(candidates, target, sum_, i) # 因为无限制重复选取,所以不是i-1 + sum_ -= candidates[i] # 回溯 + self.path.pop() # 回溯 ``` ## Go From 92ba20009d5482ecda032ecad87f81d7fa35dc09 Mon Sep 17 00:00:00 2001 From: perfumescent <31856209+perfumescent@users.noreply.github.com> Date: Sun, 10 Oct 2021 17:55:42 +0800 Subject: [PATCH 192/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A00035=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE=20golang=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0035.搜索插入位置.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md index 593e3fe5..914c2679 100644 --- a/problems/0035.搜索插入位置.md +++ b/problems/0035.搜索插入位置.md @@ -232,7 +232,24 @@ class Solution { } } ``` - +Golang: +```golang +// 第一种二分法 +func searchInsert(nums []int, target int) int { + l, r := 0, len(nums) - 1 + for l <= r{ + m := l + (r - l)/2 + if nums[m] == target{ + return m + }else if nums[m] > target{ + r = m - 1 + }else{ + l = m + 1 + } + } + return r + 1 +} +``` Python: ```python3 From 637e2f4860cf18a6be046ed5eaaffb3c03de7f88 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 10 Oct 2021 18:08:55 +0800 Subject: [PATCH 193/222] =?UTF-8?q?Update=200040.=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=80=BB=E5=92=8CII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python代码和备注 --- problems/0040.组合总和II.md | 99 +++++++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 16 deletions(-) diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index 13e0b35f..bf2685fb 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -296,24 +296,91 @@ class Solution { ``` ## Python -```python +**回溯+巧妙去重(省去使用used** +```python3 class Solution: + def __init__(self): + self.paths = [] + self.path = [] + def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: - res = [] - path = [] - def backtrack(candidates,target,sum,startIndex): - if sum == target: res.append(path[:]) - for i in range(startIndex,len(candidates)): #要对同一树层使用过的元素进行跳过 - if sum + candidates[i] > target: return - if i > startIndex and candidates[i] == candidates[i-1]: continue #直接用startIndex来去重,要对同一树层使用过的元素进行跳过 - sum += candidates[i] - path.append(candidates[i]) - backtrack(candidates,target,sum,i+1) #i+1:每个数字在每个组合中只能使用一次 - sum -= candidates[i] #回溯 - path.pop() #回溯 - candidates = sorted(candidates) #首先把给candidates排序,让其相同的元素都挨在一起。 - backtrack(candidates,target,0,0) - return res + ''' + 类似于求三数之和,求四数之和,为了避免重复组合,需要提前进行数组排序 + ''' + self.paths.clear() + self.path.clear() + # 必须提前进行数组排序,避免重复 + candidates.sort() + self.backtracking(candidates, target, 0, 0) + return self.paths + + def backtracking(self, candidates: List[int], target: int, sum_: int, start_index: int) -> None: + # Base Case + if sum_ == target: + self.paths.append(self.path[:]) + return + + # 单层递归逻辑 + for i in range(start_index, len(candidates)): + # 剪枝,同39.组合总和 + if sum_ + candidates[i] > target: + return + + # 跳过同一树层使用过的元素 + if i > start_index and candidates[i] == candidates[i-1]: + continue + + sum_ += candidates[i] + self.path.append(candidates[i]) + self.backtracking(candidates, target, sum_, i+1) + self.path.pop() # 回溯,为了下一轮for loop + sum_ -= candidates[i] # 回溯,为了下一轮for loop +``` +**回溯+去重(使用used)** +```python3 +class Solution: + def __init__(self): + self.paths = [] + self.path = [] + self.used = [] + + def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: + ''' + 类似于求三数之和,求四数之和,为了避免重复组合,需要提前进行数组排序 + 本题需要使用used,用来标记区别同一树层的元素使用重复情况:注意区分递归纵向遍历遇到的重复元素,和for循环遇到的重复元素,这两者的区别 + ''' + self.paths.clear() + self.path.clear() + self.usage_list = [False] * len(candidates) + # 必须提前进行数组排序,避免重复 + candidates.sort() + self.backtracking(candidates, target, 0, 0) + return self.paths + + def backtracking(self, candidates: List[int], target: int, sum_: int, start_index: int) -> None: + # Base Case + if sum_ == target: + self.paths.append(self.path[:]) + return + + # 单层递归逻辑 + for i in range(start_index, len(candidates)): + # 剪枝,同39.组合总和 + if sum_ + candidates[i] > target: + return + + # 检查同一树层是否出现曾经使用过的相同元素 + # 若数组中前后元素值相同,但前者却未被使用(used == False),说明是for loop中的同一树层的相同元素情况 + if i > 0 and candidates[i] == candidates[i-1] and self.usage_list[i-1] == False: + continue + + sum_ += candidates[i] + self.path.append(candidates[i]) + self.usage_list[i] = True + self.backtracking(candidates, target, sum_, i+1) + self.usage_list[i] = False # 回溯,为了下一轮for loop + self.path.pop() # 回溯,为了下一轮for loop + sum_ -= candidates[i] # 回溯,为了下一轮for loop ``` ## Go: From ffb43ada5128eeabcf53c8dcfe802513fe3d9624 Mon Sep 17 00:00:00 2001 From: perfumescent <31856209+perfumescent@users.noreply.github.com> Date: Sun, 10 Oct 2021 18:32:19 +0800 Subject: [PATCH 194/222] =?UTF-8?q?=E5=B0=860034=E7=9A=84=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E9=93=BE=E6=8E=A5=E6=B7=BB=E5=8A=A0=E8=87=B30704?= =?UTF-8?q?=E7=9A=84=E7=9B=B8=E5=85=B3=E9=A2=98=E7=9B=AE=E6=8E=A8=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0704.二分查找.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index e1900276..1cdc5896 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -140,7 +140,7 @@ public: ## 相关题目推荐 * [35.搜索插入位置](https://programmercarl.com/0035.搜索插入位置.html) -* 34.在排序数组中查找元素的第一个和最后一个位置 +* [34.在排序数组中查找元素的第一个和最后一个位置](https://programmercarl.com/0034.%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E5%85%83%E7%B4%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%92%8C%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E4%BD%8D%E7%BD%AE.html) * 69.x 的平方根 * 367.有效的完全平方数 From 01af58954329664db03e66f89b3a1156229cf315 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 10 Oct 2021 19:01:54 +0800 Subject: [PATCH 195/222] =?UTF-8?q?Update=200131.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充python注释和规范代码 --- problems/0131.分割回文串.md | 162 ++++++++++++++----------------- 1 file changed, 75 insertions(+), 87 deletions(-) diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index 811044da..3d52146b 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -290,100 +290,88 @@ class Solution { ``` ## Python -```python -# 版本一 +**回溯+正反序判断回文串** +```python3 class Solution: + def __init__(self): + self.paths = [] + self.path = [] + def partition(self, s: str) -> List[List[str]]: - res = [] - path = [] #放已经回文的子串 - def backtrack(s,startIndex): - if startIndex >= len(s): #如果起始位置已经大于s的大小,说明已经找到了一组分割方案了 - return res.append(path[:]) - for i in range(startIndex,len(s)): - p = s[startIndex:i+1] #获取[startIndex,i+1]在s中的子串 - if p == p[::-1]: path.append(p) #是回文子串 - else: continue #不是回文,跳过 - backtrack(s,i+1) #寻找i+1为起始位置的子串 - path.pop() #回溯过程,弹出本次已经填在path的子串 - backtrack(s,0) - return res - + ''' + 递归用于纵向遍历 + for循环用于横向遍历 + 当切割线迭代至字符串末尾,说明找到一种方法 + 类似组合问题,为了不重复切割同一位置,需要start_index来做标记下一轮递归的起始位置(切割线) + ''' + self.path.clear() + self.paths.clear() + self.backtracking(s, 0) + return self.paths + + def backtracking(self, s: str, start_index: int) -> None: + # Base Case + if start_index >= len(s): + self.paths.append(self.path[:]) + return + + # 单层递归逻辑 + for i in range(start_index, len(s)): + # 此次比其他组合题目多了一步判断: + # 判断被截取的这一段子串([start_index, i])是否为回文串 + temp = s[start_index:i+1] + if temp == temp[::-1]: # 若反序和正序相同,意味着这是回文串 + self.path.append(temp) + self.backtracking(s, i+1) # 递归纵向遍历:从下一处进行切割,判断其余是否仍为回文串 + self.path.pop() + else: + continue ``` -```python -# 版本二 +**回溯+函数判断回文串** +```python3 class Solution: + def __init__(self): + self.paths = [] + self.path = [] + def partition(self, s: str) -> List[List[str]]: - res = [] - path = [] #放已经回文的子串 - # 双指针法判断是否是回文串 - def isPalindrome(s): - n = len(s) - i, j = 0, n - 1 - while i < j: - if s[i] != s[j]:return False - i += 1 - j -= 1 - return True - - def backtrack(s, startIndex): - if startIndex >= len(s): # 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了 - res.append(path[:]) - return - for i in range(startIndex, len(s)): - p = s[startIndex:i+1] # 获取[startIndex,i+1]在s中的子串 - if isPalindrome(p): # 是回文子串 - path.append(p) - else: continue #不是回文,跳过 - backtrack(s, i + 1) - path.pop() #回溯过程,弹出本次已经填在path的子串 - backtrack(s, 0) - return res -``` -## Go + ''' + 递归用于纵向遍历 + for循环用于横向遍历 + 当切割线迭代至字符串末尾,说明找到一种方法 + 类似组合问题,为了不重复切割同一位置,需要start_index来做标记下一轮递归的起始位置(切割线) + ''' + self.path.clear() + self.paths.clear() + self.backtracking(s, 0) + return self.paths -注意切片(go切片是披着值类型外衣的引用类型) + def backtracking(self, s: str, start_index: int) -> None: + # Base Case + if start_index >= len(s): + self.paths.append(self.path[:]) + return + + # 单层递归逻辑 + for i in range(start_index, len(s)): + # 此次比其他组合题目多了一步判断: + # 判断被截取的这一段子串([start_index, i])是否为回文串 + if self.is_palindrome(s, start_index, i): + self.path.append(s[start_index:i+1]) + self.backtracking(s, i+1) # 递归纵向遍历:从下一处进行切割,判断其余是否仍为回文串 + self.path.pop() # 回溯 + else: + continue -```go -func partition(s string) [][]string { - var tmpString []string//切割字符串集合 - var res [][]string//结果集合 - backTracking(s,tmpString,0,&res) - return res -} -func backTracking(s string,tmpString []string,startIndex int,res *[][]string){ - if startIndex==len(s){//到达字符串末尾了 - //进行一次切片拷贝,怕之后的操作影响tmpString切片内的值 - t := make([]string, len(tmpString)) - copy(t, tmpString) - *res=append(*res,t) - } - for i:=startIndex;i bool: + i: int = start + j: int = end + while i < j: + if s[i] != s[j]: + return False + i += 1 + j -= 1 + return True ``` ## javaScript From d2667d3eda08c0739814caba0cb28a4afdc6128a Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Sun, 10 Oct 2021 19:05:53 +0800 Subject: [PATCH 196/222] =?UTF-8?q?Update=200131.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充go代码 --- problems/0131.分割回文串.md | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index 3d52146b..2070b8c3 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -374,6 +374,51 @@ class Solution: return True ``` +## Go +**注意切片(go切片是披着值类型外衣的引用类型)** +```go +func partition(s string) [][]string { + var tmpString []string//切割字符串集合 + var res [][]string//结果集合 + backTracking(s,tmpString,0,&res) + return res +} +func backTracking(s string,tmpString []string,startIndex int,res *[][]string){ + if startIndex==len(s){//到达字符串末尾了 + //进行一次切片拷贝,怕之后的操作影响tmpString切片内的值 + t := make([]string, len(tmpString)) + copy(t, tmpString) + *res=append(*res,t) + } + for i:=startIndex;i Date: Mon, 11 Oct 2021 13:30:42 +0800 Subject: [PATCH 197/222] =?UTF-8?q?Update=200093.=E5=A4=8D=E5=8E=9FIP?= =?UTF-8?q?=E5=9C=B0=E5=9D=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python3代码修正和补充注释 --- problems/0093.复原IP地址.md | 65 ++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 4e56ddc4..1d8ad296 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -342,32 +342,47 @@ class Solution: ``` python3: -```python -class Solution(object): - def restoreIpAddresses(self, s): - """ - :type s: str - :rtype: List[str] - """ - ans = [] - path = [] - def backtrack(path, startIndex): - if len(path) == 4: - if startIndex == len(s): - ans.append(".".join(path[:])) - return - for i in range(startIndex+1, min(startIndex+4, len(s)+1)): # 剪枝 - string = s[startIndex:i] - if not 0 <= int(string) <= 255: - continue - if not string == "0" and not string.lstrip('0') == string: - continue - path.append(string) - backtrack(path, i) - path.pop() +```python3 +class Solution: + def __init__(self): + self.result = [] - backtrack([], 0) - return ans``` + def restoreIpAddresses(self, s: str) -> List[str]: + ''' + 本质切割问题使用回溯搜索法,本题只能切割三次,所以纵向递归总共四层 + 因为不能重复分割,所以需要start_index来记录下一层递归分割的起始位置 + 添加变量point_num来记录逗号的数量[0,3] + ''' + self.result.clear() + if len(s) > 12: return [] + self.backtracking(s, 0, 0) + return self.result + + def backtracking(self, s: str, start_index: int, point_num: int) -> None: + # Base Case + if point_num == 3: + if self.is_valid(s, start_index, len(s)-1): + self.result.append(s[:]) + return + # 单层递归逻辑 + for i in range(start_index, len(s)): + # [start_index, i]就是被截取的子串 + if self.is_valid(s, start_index, i): + s = s[:i+1] + '.' + s[i+1:] + self.backtracking(s, i+2, point_num+1) # 在填入.后,下一子串起始后移2位 + s = s[:i+1] + s[i+2:] # 回溯 + else: + # 若当前被截取的子串大于255或者大于三位数,直接结束本层循环 + break + + def is_valid(self, s: str, start: int, end: int) -> bool: + if start > end: return False + # 若数字是0开头,不合法 + if s[start] == '0' and start != end: + return False + if not 0 <= int(s[start:end+1]) <= 255: + return False + return True ``` From cf7d7a7399127055e627a4b519b428aaa6a67784 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Mon, 11 Oct 2021 14:00:02 +0800 Subject: [PATCH 198/222] =?UTF-8?q?Update=200078.=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充注释和调整python格式 --- problems/0078.子集.md | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/problems/0078.子集.md b/problems/0078.子集.md index 878133a1..1ffc51ea 100644 --- a/problems/0078.子集.md +++ b/problems/0078.子集.md @@ -207,17 +207,28 @@ class Solution { ## Python ```python3 class Solution: + def __init__(self): + self.path: List[int] = [] + self.paths: List[List[int]] = [] + def subsets(self, nums: List[int]) -> List[List[int]]: - res = [] - path = [] - def backtrack(nums,startIndex): - res.append(path[:]) #收集子集,要放在终止添加的上面,否则会漏掉自己 - for i in range(startIndex,len(nums)): #当startIndex已经大于数组的长度了,就终止了,for循环本来也结束了,所以不需要终止条件 - path.append(nums[i]) - backtrack(nums,i+1) #递归 - path.pop() #回溯 - backtrack(nums,0) - return res + self.paths.clear() + self.path.clear() + self.backtracking(nums, 0) + return self.paths + + def backtracking(self, nums: List[int], start_index: int) -> None: + # 收集子集,要先于终止判断 + self.paths.append(self.path[:]) + # Base Case + if start_index == len(nums): + return + + # 单层递归逻辑 + for i in range(start_index, len(nums)): + self.path.append(nums[i]) + self.backtracking(nums, i+1) + self.path.pop() # 回溯 ``` ## Go From ecb99c2a296ba503c4d71e59a256b8de0c77db58 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Mon, 11 Oct 2021 14:44:00 +0800 Subject: [PATCH 199/222] =?UTF-8?q?Update=200090.=E5=AD=90=E9=9B=86II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正python代码补充注释 --- problems/0090.子集II.md | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index 7ae7c6c2..665137e9 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -207,20 +207,30 @@ class Solution { Python: ```python3 class Solution: + def __init__(self): + self.paths = [] + self.path = [] + def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: - res = [] #存放符合条件结果的集合 - path = [] #用来存放符合条件结果 - def backtrack(nums,startIndex): - res.append(path[:]) - for i in range(startIndex,len(nums)): - if i > startIndex and nums[i] == nums[i - 1]: #我们要对同一树层使用过的元素进行跳过 - continue - path.append(nums[i]) - backtrack(nums,i+1) #递归 - path.pop() #回溯 - nums = sorted(nums) #去重需要排序 - backtrack(nums,0) - return res + nums.sort() + self.backtracking(nums, 0) + return self.paths + + def backtracking(self, nums: List[int], start_index: int) -> None: + # ps.空集合仍符合要求 + self.paths.append(self.path[:]) + # Base Case + if start_index == len(nums): + return + + # 单层递归逻辑 + for i in range(start_index, len(nums)): + if i > start_index and nums[i] == nums[i-1]: + # 当前后元素值相同时,跳入下一个循环,去重 + continue + self.path.append(nums[i]) + self.backtracking(nums, i+1) + self.path.pop() ``` Go: From 07dd85094c722fa71fb4460781b10a49ebe11efb Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Mon, 11 Oct 2021 16:10:34 +0800 Subject: [PATCH 200/222] =?UTF-8?q?Update=200491.=E9=80=92=E5=A2=9E?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补全python代码补充注释 --- problems/0491.递增子序列.md | 93 ++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 22 deletions(-) diff --git a/problems/0491.递增子序列.md b/problems/0491.递增子序列.md index e947b2b9..e8ab8eca 100644 --- a/problems/0491.递增子序列.md +++ b/problems/0491.递增子序列.md @@ -229,32 +229,81 @@ class Solution { } } ``` - - Python: +**回溯** ```python3 class Solution: - def findSubsequences(self, nums: List[int]) -> List[List[int]]: - res = [] - path = [] - def backtrack(nums,startIndex): - repeat = [] #这里使用数组来进行去重操作 - if len(path) >=2: - res.append(path[:]) #注意这里不要加return,要取树上的节点 - for i in range(startIndex,len(nums)): - if nums[i] in repeat: - continue - if len(path) >= 1: - if nums[i] < path[-1]: - continue - repeat.append(nums[i]) #记录这个元素在本层用过了,本层后面不能再用了 - path.append(nums[i]) - backtrack(nums,i+1) - path.pop() - backtrack(nums,0) - return res -``` + def __init__(self): + self.paths = [] + self.path = [] + def findSubsequences(self, nums: List[int]) -> List[List[int]]: + ''' + 本题求自增子序列,所以不能改变原数组顺序 + ''' + self.backtracking(nums, 0) + return self.paths + + def backtracking(self, nums: List[int], start_index: int): + # 收集结果,同78.子集,仍要置于终止条件之前 + if len(self.path) >= 2: + # 本题要求所有的节点 + self.paths.append(self.path[:]) + + # Base Case(可忽略) + if start_index == len(nums): + return + + # 单层递归逻辑 + # 深度遍历中每一层都会有一个全新的usage_list用于记录本层元素是否重复使用 + usage_list = set() + # 同层横向遍历 + for i in range(start_index, len(nums)): + # 若当前元素值小于前一个时(非递增)或者曾用过,跳入下一循环 + if (self.path and nums[i] < self.path[-1]) or nums[i] in usage_list: + continue + usage_list.add(nums[i]) + self.path.append(nums[i]) + self.backtracking(nums, i+1) + self.path.pop() +``` +**回溯+哈希表去重** +```python3 +class Solution: + def __init__(self): + self.paths = [] + self.path = [] + + def findSubsequences(self, nums: List[int]) -> List[List[int]]: + ''' + 本题求自增子序列,所以不能改变原数组顺序 + ''' + self.backtracking(nums, 0) + return self.paths + + def backtracking(self, nums: List[int], start_index: int): + # 收集结果,同78.子集,仍要置于终止条件之前 + if len(self.path) >= 2: + # 本题要求所有的节点 + self.paths.append(self.path[:]) + + # Base Case(可忽略) + if start_index == len(nums): + return + + # 单层递归逻辑 + # 深度遍历中每一层都会有一个全新的usage_list用于记录本层元素是否重复使用 + usage_list = [False] * 201 # 使用列表去重,题中取值范围[-100, 100] + # 同层横向遍历 + for i in range(start_index, len(nums)): + # 若当前元素值小于前一个时(非递增)或者曾用过,跳入下一循环 + if (self.path and nums[i] < self.path[-1]) or usage_list[nums[i]+100] == True: + continue + usage_list[nums[i]+100] = True + self.path.append(nums[i]) + self.backtracking(nums, i+1) + self.path.pop() +``` Go: ```golang From 68502287a2281abc90a5ee8bff621556ed5aea94 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Mon, 11 Oct 2021 16:41:27 +0800 Subject: [PATCH 201/222] =?UTF-8?q?Update=200046.=E5=85=A8=E6=8E=92?= =?UTF-8?q?=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化python代码以及补充注释 --- problems/0046.全排列.md | 88 ++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 32 deletions(-) diff --git a/problems/0046.全排列.md b/problems/0046.全排列.md index 1e1252ae..5e36927c 100644 --- a/problems/0046.全排列.md +++ b/problems/0046.全排列.md @@ -211,44 +211,68 @@ class Solution { ``` Python: +**回溯** ```python3 class Solution: - def permute(self, nums: List[int]) -> List[List[int]]: - res = [] #存放符合条件结果的集合 - path = [] #用来存放符合条件的结果 - used = [] #用来存放已经用过的数字 - def backtrack(nums,used): - if len(path) == len(nums): - return res.append(path[:]) #此时说明找到了一组 - for i in range(0,len(nums)): - if nums[i] in used: - continue #used里已经收录的元素,直接跳过 - path.append(nums[i]) - used.append(nums[i]) - backtrack(nums,used) - used.pop() - path.pop() - backtrack(nums,used) - return res -``` + def __init__(self): + self.path = [] + self.paths = [] -Python(优化,不用used数组): + def permute(self, nums: List[int]) -> List[List[int]]: + ''' + 因为本题排列是有序的,这意味着同一层的元素可以重复使用,但同一树枝上不能重复使用(usage_list) + 所以处理排列问题每层都需要从头搜索,故不再使用start_index + ''' + usage_list = [False] * len(nums) + self.backtracking(nums, usage_list) + return self.paths + + def backtracking(self, nums: List[int], usage_list: List[bool]) -> None: + # Base Case本题求叶子节点 + if len(self.path) == len(nums): + self.paths.append(self.path[:]) + return + + # 单层递归逻辑 + for i in range(0, len(nums)): # 从头开始搜索 + # 若遇到self.path里已收录的元素,跳过 + if usage_list[i] == True: + continue + usage_list[i] = True + self.path.append(nums[i]) + self.backtracking(nums, usage_list) # 纵向传递使用信息,去重 + self.path.pop() + usage_list[i] = False +``` +**回溯+丢掉usage_list** ```python3 class Solution: + def __init__(self): + self.path = [] + self.paths = [] + def permute(self, nums: List[int]) -> List[List[int]]: - res = [] #存放符合条件结果的集合 - path = [] #用来存放符合条件的结果 - def backtrack(nums): - if len(path) == len(nums): - return res.append(path[:]) #此时说明找到了一组 - for i in range(0,len(nums)): - if nums[i] in path: #path里已经收录的元素,直接跳过 - continue - path.append(nums[i]) - backtrack(nums) #递归 - path.pop() #回溯 - backtrack(nums) - return res + ''' + 因为本题排列是有序的,这意味着同一层的元素可以重复使用,但同一树枝上不能重复使用 + 所以处理排列问题每层都需要从头搜索,故不再使用start_index + ''' + self.backtracking(nums) + return self.paths + + def backtracking(self, nums: List[int]) -> None: + # Base Case本题求叶子节点 + if len(self.path) == len(nums): + self.paths.append(self.path[:]) + return + + # 单层递归逻辑 + for i in range(0, len(nums)): # 从头开始搜索 + # 若遇到self.path里已收录的元素,跳过 + if nums[i] in self.path: + continue + self.path.append(nums[i]) + self.backtracking(nums) + self.path.pop() ``` Go: From 536b3594226cc989e624cae8b2603673f3199176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=89=E8=8E=93=E5=B0=8F=E9=A5=BC=E8=82=9D?= Date: Mon, 11 Oct 2021 18:56:47 +0800 Subject: [PATCH 202/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200042=E6=8E=A5?= =?UTF-8?q?=E9=9B=A8=E6=B0=B4=20Go=E8=AF=AD=E8=A8=80=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0042.接雨水.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index b75865d7..9b26bc6b 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -579,6 +579,31 @@ class Solution: Go: +```go +func trap(height []int) int { + var left, right, leftMax, rightMax, res int + right = len(height) - 1 + for left < right { + if height[left] < height[right] { + if height[left] >= leftMax { + leftMax = height[left] // 设置左边最高柱子 + } else { + res += leftMax - height[left] // //右边必定有柱子挡水,所以遇到所有值小于等于leftMax的,全部加入水池中 + } + left++ + } else { + if height[right] > rightMax { + rightMax = height[right] // //设置右边最高柱子 + } else { + res += rightMax - height[right] // //左边必定有柱子挡水,所以,遇到所有值小于等于rightMax的,全部加入水池 + } + right-- + } + } + return res +} +``` + JavaScript: ```javascript //双指针 From 6287b670aada181cd398782c9a681a96f3874a56 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Tue, 12 Oct 2021 14:11:05 +0800 Subject: [PATCH 203/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201365=20=E6=9C=89?= =?UTF-8?q?=E5=A4=9A=E5=B0=91=E4=B8=AA=E5=B0=8F=E4=BA=8E=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E7=9A=84=E6=95=B0=E5=AD=97=20JavaScript?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=8D=E4=BD=BF=E7=94=A8=E5=93=88=E5=B8=8C?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...65.有多少小于当前数字的数字.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/problems/1365.有多少小于当前数字的数字.md b/problems/1365.有多少小于当前数字的数字.md index 69654930..9f282209 100644 --- a/problems/1365.有多少小于当前数字的数字.md +++ b/problems/1365.有多少小于当前数字的数字.md @@ -156,6 +156,7 @@ Go: JavaScript: ```javascript +// 方法一:使用哈希表记录位置 var smallerNumbersThanCurrent = function(nums) { const map = new Map();// 记录数字 nums[i] 有多少个比它小的数字 const res = nums.slice(0);//深拷贝nums @@ -171,9 +172,27 @@ var smallerNumbersThanCurrent = function(nums) { } return res; }; + +// 方法二:不使用哈希表,只使用一个额外数组 +/** + * @param {number[]} nums + * @return {number[]} + */ +var smallerNumbersThanCurrent = function(nums) { + let array = [...nums]; // 深拷贝 + // 升序排列,此时数组元素下标即是比他小的元素的个数 + array = array.sort((a, b) => a-b); + let res = []; + nums.forEach( x => { + // 即使元素重复也不怕,indexOf 只返回找到的第一个元素的下标 + res.push(array.indexOf(x)); + }) + return res; +}; ``` + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) From dd4515a68b4e4f32b473b72c475ee7099520fd31 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Tue, 12 Oct 2021 14:50:44 +0800 Subject: [PATCH 204/222] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201207=20=E7=8B=AC?= =?UTF-8?q?=E4=B8=80=E6=97=A0=E4=BA=8C=E7=9A=84=E5=87=BA=E7=8E=B0=E6=AC=A1?= =?UTF-8?q?=E6=95=B0=20JavaScript=E7=89=88=E6=9C=AC=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=93=88=E5=B8=8C=E8=A1=A8=E5=92=8C=E9=9B=86=E5=90=88=E7=9A=84?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1207.独一无二的出现次数.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/problems/1207.独一无二的出现次数.md b/problems/1207.独一无二的出现次数.md index a65b26e6..808ff9f8 100644 --- a/problems/1207.独一无二的出现次数.md +++ b/problems/1207.独一无二的出现次数.md @@ -119,6 +119,7 @@ Go: JavaScript: ``` javascript +// 方法一:使用数组记录元素出现次数 var uniqueOccurrences = function(arr) { const count = new Array(2002).fill(0);// -1000 <= arr[i] <= 1000 for(let i = 0; i < arr.length; i++){ @@ -134,6 +135,21 @@ var uniqueOccurrences = function(arr) { } return true; }; + +// 方法二:使用Map 和 Set +/** + * @param {number[]} arr + * @return {boolean} + */ +var uniqueOccurrences = function(arr) { + // 记录每个元素出现次数 + let map = new Map(); + arr.forEach( x => { + map.set(x, (map.get(x) || 0) + 1); + }) + // Set() 里的元素是不重复的。如果有元素出现次数相同,则最后的set的长度不等于map的长度 + return map.size === new Set(map.values()).size +}; ``` ----------------------- From f70dc0595ae3ce0c88eab9718dd25c1153b426f0 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Tue, 12 Oct 2021 14:54:53 +0800 Subject: [PATCH 205/222] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E6=A8=A1=E6=9D=BFC++=E4=BB=A3=E7=A0=81=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/算法模板.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/problems/算法模板.md b/problems/算法模板.md index df823e81..c772c178 100644 --- a/problems/算法模板.md +++ b/problems/算法模板.md @@ -8,7 +8,7 @@ ## 二分查找法 -``` +```c++ class Solution { public: int searchInsert(vector& nums, int target) { @@ -33,7 +33,7 @@ public: ## KMP -``` +```c++ void kmp(int* next, const string& s){ next[0] = -1; int j = -1; @@ -53,7 +53,7 @@ void kmp(int* next, const string& s){ 二叉树的定义: -``` +```c++ struct TreeNode { int val; TreeNode *left; @@ -65,7 +65,7 @@ struct TreeNode { ### 深度优先遍历(递归) 前序遍历(中左右) -``` +```c++ void traversal(TreeNode* cur, vector& vec) { if (cur == NULL) return; vec.push_back(cur->val); // 中 ,同时也是处理节点逻辑的地方 @@ -74,7 +74,7 @@ void traversal(TreeNode* cur, vector& vec) { } ``` 中序遍历(左中右) -``` +```c++ void traversal(TreeNode* cur, vector& vec) { if (cur == NULL) return; traversal(cur->left, vec); // 左 @@ -83,7 +83,7 @@ void traversal(TreeNode* cur, vector& vec) { } ``` 后序遍历(左右中) -``` +```c++ void traversal(TreeNode* cur, vector& vec) { if (cur == NULL) return; traversal(cur->left, vec); // 左 @@ -97,7 +97,7 @@ void traversal(TreeNode* cur, vector& vec) { 相关题解:[0094.二叉树的中序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0094.二叉树的中序遍历.md) 前序遍历(中左右) -``` +```c++ vector preorderTraversal(TreeNode* root) { vector result; stack st; @@ -123,7 +123,7 @@ vector preorderTraversal(TreeNode* root) { ``` 中序遍历(左中右) -``` +```c++ vector inorderTraversal(TreeNode* root) { vector result; // 存放中序遍历的元素 stack st; @@ -148,7 +148,7 @@ vector inorderTraversal(TreeNode* root) { ``` 后序遍历(左右中) -``` +```c++ vector postorderTraversal(TreeNode* root) { vector result; stack st; @@ -176,7 +176,7 @@ vector postorderTraversal(TreeNode* root) { 相关题解:[0102.二叉树的层序遍历](https://programmercarl.com/0102.二叉树的层序遍历.html) -``` +```c++ vector> levelOrder(TreeNode* root) { queue que; if (root != NULL) que.push(root); @@ -212,7 +212,7 @@ vector> levelOrder(TreeNode* root) { ### 二叉树深度 -``` +```c++ int getDepth(TreeNode* node) { if (node == NULL) return 0; return 1 + max(getDepth(node->left), getDepth(node->right)); @@ -221,7 +221,7 @@ int getDepth(TreeNode* node) { ### 二叉树节点数量 -``` +```c++ int countNodes(TreeNode* root) { if (root == NULL) return 0; return 1 + countNodes(root->left) + countNodes(root->right); @@ -229,7 +229,7 @@ int countNodes(TreeNode* root) { ``` ## 回溯算法 -``` +```c++ void backtracking(参数) { if (终止条件) { 存放结果; @@ -247,7 +247,7 @@ void backtracking(参数) { ## 并查集 -``` +```c++ int n = 1005; // 更具题意而定 int father[1005]; From e2686eb2af462585fac0cfab898de14b0cf337a1 Mon Sep 17 00:00:00 2001 From: Asterisk <44215173+casnz1601@users.noreply.github.com> Date: Tue, 12 Oct 2021 20:49:36 +0800 Subject: [PATCH 206/222] =?UTF-8?q?Update=200037.=E8=A7=A3=E6=95=B0?= =?UTF-8?q?=E7=8B=AC.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 规范python代码补充注释 --- problems/0037.解数独.md | 109 +++++++++++-------------------------- 1 file changed, 32 insertions(+), 77 deletions(-) diff --git a/problems/0037.解数独.md b/problems/0037.解数独.md index 7bc07252..d5b450aa 100644 --- a/problems/0037.解数独.md +++ b/problems/0037.解数独.md @@ -293,85 +293,40 @@ class Solution: """ Do not return anything, modify board in-place instead. """ - def backtrack(board): - for i in range(len(board)): #遍历行 - for j in range(len(board[0])): #遍历列 - if board[i][j] != ".": continue - for k in range(1,10): #(i, j) 这个位置放k是否合适 - if isValid(i,j,k,board): - board[i][j] = str(k) #放置k - if backtrack(board): return True #如果找到合适一组立刻返回 - board[i][j] = "." #回溯,撤销k - return False #9个数都试完了,都不行,那么就返回false - return True #遍历完没有返回false,说明找到了合适棋盘位置了 - def isValid(row,col,val,board): - for i in range(9): #判断行里是否重复 - if board[row][i] == str(val): + self.backtracking(board) + + def backtracking(self, board: List[List[str]]) -> bool: + # 若有解,返回True;若无解,返回False + for i in range(len(board)): # 遍历行 + for j in range(len(board[0])): # 遍历列 + # 若空格内已有数字,跳过 + if board[i][j] != '.': continue + for k in range(1, 10): + if self.is_valid(i, j, k, board): + board[i][j] = str(k) + if self.backtracking(board): return True + board[i][j] = '.' + # 若数字1-9都不能成功填入空格,返回False无解 + return False + return True # 有解 + + def is_valid(self, row: int, col: int, val: int, board: List[List[str]]) -> bool: + # 判断同一行是否冲突 + for i in range(9): + if board[row][i] == str(val): + return False + # 判断同一列是否冲突 + for j in range(9): + if board[j][col] == str(val): + return False + # 判断同一九宫格是否有冲突 + start_row = (row // 3) * 3 + start_col = (col // 3) * 3 + for i in range(start_row, start_row + 3): + for j in range(start_col, start_col + 3): + if board[i][j] == str(val): return False - for j in range(9): #判断列里是否重复 - if board[j][col] == str(val): - return False - startRow = (row // 3) * 3 - startcol = (col // 3) * 3 - for i in range(startRow,startRow + 3): #判断9方格里是否重复 - for j in range(startcol,startcol + 3): - if board[i][j] == str(val): - return False - return True - backtrack(board) -``` - -Python3: - -```python3 -class Solution: - def __init__(self) -> None: - self.board = [] - - def isValid(self, row: int, col: int, target: int) -> bool: - for idx in range(len(self.board)): - # 同列是否重复 - if self.board[idx][col] == str(target): - return False - # 同行是否重复 - if self.board[row][idx] == str(target): - return False - # 9宫格里是否重复 - box_row, box_col = (row // 3) * 3 + idx // 3, (col // 3) * 3 + idx % 3 - if self.board[box_row][box_col] == str(target): - return False return True - - def getPlace(self) -> List[int]: - for row in range(len(self.board)): - for col in range(len(self.board)): - if self.board[row][col] == ".": - return [row, col] - return [-1, -1] - - def isSolved(self) -> bool: - row, col = self.getPlace() # 找个空位置 - - if row == -1 and col == -1: # 没有空位置,棋盘被填满的 - return True - - for i in range(1, 10): - if self.isValid(row, col, i): # 检查这个空位置放i,是否合适 - self.board[row][col] = str(i) # 放i - if self.isSolved(): # 合适,立刻返回, 填下一个空位置。 - return True - self.board[row][col] = "." # 不合适,回溯 - - return False # 空位置没法解决 - - def solveSudoku(self, board: List[List[str]]) -> None: - """ - Do not return anything, modify board in-place instead. - """ - if board is None or len(board) == 0: - return - self.board = board - self.isSolved() ``` Go: From b64e34815dc60ba7b0a2450a7bcf7cd723ec0abc Mon Sep 17 00:00:00 2001 From: Henry Du Date: Tue, 12 Oct 2021 18:27:06 -0700 Subject: [PATCH 207/222] =?UTF-8?q?Add=20Go=20into=20337.=E6=89=93?= =?UTF-8?q?=E5=AE=B6=E5=8A=AB=E8=88=8DIII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0337.打家劫舍III.md | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/problems/0337.打家劫舍III.md b/problems/0337.打家劫舍III.md index 949137c3..8456adf1 100644 --- a/problems/0337.打家劫舍III.md +++ b/problems/0337.打家劫舍III.md @@ -368,6 +368,41 @@ class Solution: return (val1, val2) ``` +Go: + +> 动态规划 + +```go +func rob(root *TreeNode) int { + res := robTree(root) + return max(res[0], res[1]) +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func robTree(cur *TreeNode) []int { + if cur == nil { + return []int{0, 0} + } + // 后序遍历 + left := robTree(cur.Left) + right := robTree(cur.Right) + + // 考虑去偷当前的屋子 + robCur := cur.Val + left[0] + right[0] + // 考虑不去偷当前的屋子 + notRobCur := max(left[0], left[1]) + max(right[0], right[1]) + + // 注意顺序:0:不偷,1:去偷 + return []int{notRobCur, robCur} +} +``` + JavaScript: > 动态规划 From 0d2d732378c4befa2b3ebacb5cd890dcb62981d7 Mon Sep 17 00:00:00 2001 From: Wen Date: Wed, 13 Oct 2021 12:16:57 +0800 Subject: [PATCH 208/222] =?UTF-8?q?=E6=96=B0=E5=A2=9E=200416.=E5=88=86?= =?UTF-8?q?=E5=89=B2=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md=20Go=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0416.分割等和子集.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index c8a5beea..88852e9d 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -238,6 +238,32 @@ class Solution: return taraget == dp[taraget] ``` Go: +```go +// 分割等和子集 动态规划 +// 时间复杂度O(n^2) 空间复杂度O(n) +func canPartition(nums []int) bool { + sum := 0 + for _, num := range nums { + sum += num + } + // 如果 nums 的总和为奇数则不可能平分成两个子集 + if sum % 2 == 1 { + return false + } + + target := sum / 2 + dp := make([]int, target + 1) + + for _, num := range nums { + for j := target; j >= num; j-- { + if dp[j] < dp[j - num] + num { + dp[j] = dp[j - num] + num + } + } + } + return dp[target] == target +} +``` javaScript: From 7484ba1e003679facc73922ab3d9eb1c909febce Mon Sep 17 00:00:00 2001 From: BarneyShi Date: Tue, 12 Oct 2021 23:06:12 -0700 Subject: [PATCH 209/222] =?UTF-8?q?=E5=89=91=E6=8C=87Offer=2058=20-=20?= =?UTF-8?q?=E4=B8=8D=E4=BD=BF=E7=94=A8=E9=A2=9D=E5=A4=96=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E7=9A=84JS=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../剑指Offer58-II.左旋转字符串.md | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md index 29243c6d..60f7115d 100644 --- a/problems/剑指Offer58-II.左旋转字符串.md +++ b/problems/剑指Offer58-II.左旋转字符串.md @@ -200,17 +200,14 @@ func reverse(b []byte, left, right int){ JavaScript: ```javascript -var reverseLeftWords = function (s, n) { - const reverse = (str, left, right) => { - let strArr = str.split(""); - for (; left < right; left++, right--) { - [strArr[left], strArr[right]] = [strArr[right], strArr[left]]; - } - return strArr.join(""); - } - s = reverse(s, 0, n - 1); - s = reverse(s, n, s.length - 1); - return reverse(s, 0, s.length - 1); +var reverseLeftWords = function(s, n) { + const length = s.length; + let i = 0; + while (i < length - n) { + s = s[length - 1] + s; + i++; + } + return s.slice(0, length); }; ``` From 5c69042ea2f4238617868a785e6ab51946c7d813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Thu, 14 Oct 2021 09:53:25 +0800 Subject: [PATCH 210/222] =?UTF-8?q?Update=20=E7=AE=97=E6=B3=95=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/算法模板.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/problems/算法模板.md b/problems/算法模板.md index c772c178..216ae6b6 100644 --- a/problems/算法模板.md +++ b/problems/算法模板.md @@ -8,7 +8,7 @@ ## 二分查找法 -```c++ +```CPP class Solution { public: int searchInsert(vector& nums, int target) { @@ -33,7 +33,7 @@ public: ## KMP -```c++ +```CPP void kmp(int* next, const string& s){ next[0] = -1; int j = -1; @@ -53,7 +53,7 @@ void kmp(int* next, const string& s){ 二叉树的定义: -```c++ +```CPP struct TreeNode { int val; TreeNode *left; @@ -65,7 +65,7 @@ struct TreeNode { ### 深度优先遍历(递归) 前序遍历(中左右) -```c++ +```CPP void traversal(TreeNode* cur, vector& vec) { if (cur == NULL) return; vec.push_back(cur->val); // 中 ,同时也是处理节点逻辑的地方 @@ -74,7 +74,7 @@ void traversal(TreeNode* cur, vector& vec) { } ``` 中序遍历(左中右) -```c++ +```CPP void traversal(TreeNode* cur, vector& vec) { if (cur == NULL) return; traversal(cur->left, vec); // 左 @@ -83,7 +83,7 @@ void traversal(TreeNode* cur, vector& vec) { } ``` 后序遍历(左右中) -```c++ +```CPP void traversal(TreeNode* cur, vector& vec) { if (cur == NULL) return; traversal(cur->left, vec); // 左 @@ -97,7 +97,7 @@ void traversal(TreeNode* cur, vector& vec) { 相关题解:[0094.二叉树的中序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0094.二叉树的中序遍历.md) 前序遍历(中左右) -```c++ +```CPP vector preorderTraversal(TreeNode* root) { vector result; stack st; @@ -123,7 +123,7 @@ vector preorderTraversal(TreeNode* root) { ``` 中序遍历(左中右) -```c++ +```CPP vector inorderTraversal(TreeNode* root) { vector result; // 存放中序遍历的元素 stack st; @@ -148,7 +148,7 @@ vector inorderTraversal(TreeNode* root) { ``` 后序遍历(左右中) -```c++ +```CPP vector postorderTraversal(TreeNode* root) { vector result; stack st; @@ -176,7 +176,7 @@ vector postorderTraversal(TreeNode* root) { 相关题解:[0102.二叉树的层序遍历](https://programmercarl.com/0102.二叉树的层序遍历.html) -```c++ +```CPP vector> levelOrder(TreeNode* root) { queue que; if (root != NULL) que.push(root); @@ -212,7 +212,7 @@ vector> levelOrder(TreeNode* root) { ### 二叉树深度 -```c++ +```CPP int getDepth(TreeNode* node) { if (node == NULL) return 0; return 1 + max(getDepth(node->left), getDepth(node->right)); @@ -221,7 +221,7 @@ int getDepth(TreeNode* node) { ### 二叉树节点数量 -```c++ +```CPP int countNodes(TreeNode* root) { if (root == NULL) return 0; return 1 + countNodes(root->left) + countNodes(root->right); @@ -229,7 +229,7 @@ int countNodes(TreeNode* root) { ``` ## 回溯算法 -```c++ +```CPP void backtracking(参数) { if (终止条件) { 存放结果; @@ -247,7 +247,7 @@ void backtracking(参数) { ## 并查集 -```c++ +```CPP int n = 1005; // 更具题意而定 int father[1005]; From aedda8732e662a76a4d4e6916da0f31230487889 Mon Sep 17 00:00:00 2001 From: hailincai Date: Thu, 14 Oct 2021 07:16:33 -0400 Subject: [PATCH 211/222] =?UTF-8?q?Update=200707.=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E9=93=BE=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Format the ListNode definition for java code --- problems/0707.设计链表.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md index 64472506..ba0e7e3b 100644 --- a/problems/0707.设计链表.md +++ b/problems/0707.设计链表.md @@ -282,12 +282,12 @@ Java: ```Java //单链表 class ListNode { -int val; -ListNode next; -ListNode(){} -ListNode(int val) { -this.val=val; -} + int val; + ListNode next; + ListNode(){} + ListNode(int val) { + this.val=val; + } } class MyLinkedList { //size存储链表元素的个数 From e037b8755822d926de2b44eff180824f2baa4b7c Mon Sep 17 00:00:00 2001 From: hailincai Date: Thu, 14 Oct 2021 07:58:33 -0400 Subject: [PATCH 212/222] =?UTF-8?q?Update=200206.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E9=93=BE=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加Java从后向前递归的代码 --- problems/0206.翻转链表.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index ec6f3dca..3e2a22be 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -164,6 +164,25 @@ class Solution { } ``` +```java +// 从后向前递归 +class Solution { + ListNode reverseList(ListNode head) { + // 边缘条件判断 + if(head == null) return null; + if (head.next == null) return head; + + // 递归调用,翻转第二个节点开始往后的链表 + ListNode last = reverseList(head.next); + // 翻转头节点与第二个节点的指向 + head.next.next = head; + // 此时的 head 节点为尾节点,next 需要指向 NULL + head.next = null; + return last; + } +} +``` + Python迭代法: ```python #双指针 From 99d28fcc002dc5bb40952f01d3c975ec46b867b5 Mon Sep 17 00:00:00 2001 From: baici1 <249337001@qq.com> Date: Fri, 15 Oct 2021 16:21:58 +0800 Subject: [PATCH 213/222] =?UTF-8?q?337.=E6=89=93=E5=AE=B6=E5=8A=AB?= =?UTF-8?q?=E8=88=8D=E2=85=A2=20=E5=A2=9E=E5=8A=A0go=E7=9A=84=E8=A7=A3?= =?UTF-8?q?=E6=B3=95=20=E6=A0=91=E5=BD=A2DP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0337.打家劫舍III.md | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/problems/0337.打家劫舍III.md b/problems/0337.打家劫舍III.md index 949137c3..204c3815 100644 --- a/problems/0337.打家劫舍III.md +++ b/problems/0337.打家劫舍III.md @@ -368,6 +368,48 @@ class Solution: return (val1, val2) ``` +Go: + +树形DP + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func rob(root *TreeNode) int { + return max(robTree(root)) +} +func robTree(root *TreeNode)(int,int){ + if root==nil{ + return 0,0 + } + //获取左节点的偷的值与不偷的值 + left0,left1:=robTree(root.Left) + //获取右节点的偷的值与不偷的值 + right0,right1:=robTree(root.Right) + //偷 + val1:=root.Val + val1+=left1+right1 + //不偷 + val2:=0 + val2+=max(left0,left1)+max(right0,right1) + return val1,val2 +} +func max(a,b int)int{ + if a>b{ + return a + } + return b +} +``` + + + JavaScript: > 动态规划 From 77d346988b1718b34f4997e7d08be82c418edd6b Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 15 Oct 2021 20:16:39 +0800 Subject: [PATCH 214/222] =?UTF-8?q?=E6=94=B9=E8=BF=9B=200143=20=E9=87=8D?= =?UTF-8?q?=E6=8E=92=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在使用数组存储链表节点的写法中,最后再判断数组长度为偶数时时没有必要的,因为在循环体while里面,我们用的是 i<=j。 --- problems/0143.重排链表.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index c5ac9bae..a6412d2e 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -50,10 +50,6 @@ public: cur = cur->next; count++; } - if (vec.size() % 2 == 0) { // 如果是偶数,还要多处理中间的一个 - cur->next = vec[i]; - cur = cur->next; - } cur->next = nullptr; // 注意结尾 } }; @@ -249,12 +245,6 @@ public class ReorderList { cur = cur.next; count++; } - // 当是偶数的话,需要做额外处理 - if (list.size() % 2== 0){ - cur.next = list.get(l); - cur = cur.next; - } - // 注意结尾要结束一波 cur.next = null; } @@ -376,11 +366,6 @@ var reorderList = function(head, s = [], tmp) { cur = cur.next; count++; } - // 当是偶数的话,需要做额外处理 - if(list.length % 2 == 0){ - cur.next = list[l]; - cur = cur.next; - } // 注意结尾要结束一波 cur.next = null; } From 5d0d80abc978a01c2b5f6f17583f890ece8988ea Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 15 Oct 2021 21:33:20 +0800 Subject: [PATCH 215/222] =?UTF-8?q?=E7=AE=97=E6=B3=95=E6=A8=A1=E6=9D=BF=20?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=20JavaScript=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/算法模板.md | 259 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 258 insertions(+), 1 deletion(-) diff --git a/problems/算法模板.md b/problems/算法模板.md index 216ae6b6..9fa4f1a8 100644 --- a/problems/算法模板.md +++ b/problems/算法模板.md @@ -248,7 +248,7 @@ void backtracking(参数) { ## 并查集 ```CPP - int n = 1005; // 更具题意而定 + int n = 1005; // 根据题意而定 int father[1005]; // 并查集初始化 @@ -280,6 +280,263 @@ void backtracking(参数) { (持续补充ing) ## 其他语言版本 +JavaScript: + +## 二分查找法 + +使用左闭右闭区间 + +```javascript +var search = function (nums, target) { + let left = 0, right = nums.length - 1; + // 使用左闭右闭区间 + while (left <= right) { + let mid = left + Math.floor((right - left)/2); + if (nums[mid] > target) { + right = mid - 1; // 去左面闭区间寻找 + } else if (nums[mid] < target) { + left = mid + 1; // 去右面闭区间寻找 + } else { + return mid; + } + } + return -1; +}; +``` + +使用左闭右开区间 + +```javascript +var search = function (nums, target) { + let left = 0, right = nums.length; + // 使用左闭右开区间 [left, right) + while (left < right) { + let mid = left + Math.floor((right - left)/2); + if (nums[mid] > target) { + right = mid; // 去左面闭区间寻找 + } else if (nums[mid] < target) { + left = mid + 1; // 去右面闭区间寻找 + } else { + return mid; + } + } + return -1; +}; +``` + +## KMP + +```javascript +var kmp = function (next, s) { + next[0] = -1; + let j = -1; + for(let i = 1; i < s.length; i++){ + while (j >= 0 && s[i] !== s[j + 1]) { + j = next[j]; + } + if (s[i] === s[j + 1]) { + j++; + } + next[i] = j; + } +} +``` + +## 二叉树 + +### 深度优先遍历(递归) + +二叉树节点定义: + +```javascript +function TreeNode (val, left, right) { + this.val = (val === undefined ? 0 : val); + this.left = (left === undefined ? null : left); + this.right = (right === undefined ? null : right); +} +``` + +前序遍历(中左右): + +```javascript +var preorder = function (root, list) { + if (root === null) return; + list.push(root.val); // 中 + preorder(root.left, list); // 左 + preorder(root.right, list); // 右 +} +``` + +中序遍历(左中右): + +```javascript +var inorder = function (root, list) { + if (root === null) return; + inorder(root.left, list); // 左 + list.push(root.val); // 中 + inorder(root.right, list); // 右 +} +``` + +后序遍历(左右中): + +```javascript +var postorder = function (root, list) { + if (root === null) return; + postorder(root.left, list); // 左 + postorder(root.right, list); // 右 + list.push(root.val); // 中 +} +``` + +### 深度优先遍历(迭代) + +前序遍历(中左右): + +```javascript +var preorderTraversal = function (root) { + let res = []; + if (root === null) return rs; + let stack = [root], + cur = null; + while (stack.length) { + cur = stack.pop(); + res.push(cur.val); + cur.right && stack.push(cur.right); + cur.left && stack.push(cur.left); + } + return res; +}; +``` + +中序遍历(左中右): + +```javascript +var inorderTraversal = function (root) { + let res = []; + if (root === null) return res; + let stack = []; + let cur = root; + while (stack.length !== 0 || cur !== null) { + if (cur !== null) { + stack.push(cur); + cur = cur.left; + } else { + cur = stack.pop(); + res.push(cur.val); + cur = cur.right; + } + } + return res; +}; +``` + +后序遍历(左右中): + +```javascript +var postorderTraversal = function (root) { + let res = []; + if (root === null) return res; + let stack = [root]; + let cur = null; + while (stack.length) { + cur = stack.pop(); + res.push(cur.val); + cur.left && stack.push(cur.left); + cur.right && stack.push(cur.right); + } + return res.reverse() +}; +``` + +### 广度优先遍历(队列) + +```javascript +var levelOrder = function (root) { + let res = []; + if (root === null) return res; + let queue = [root]; + while (queue.length) { + let n = queue.length; + let temp = []; + for (let i = 0; i < n; i++) { + let node = queue.shift(); + temp.push(node.val); + node.left &&queue.push(node.left); + node.right && queue.push(node.right); + } + res.push(temp); + } + return res; +}; +``` + +### 二叉树深度 + +```javascript +var getDepth = function (node) { + if (node === null) return 0; + return 1 + Math.max(getDepth(node.left), getDepth(node.right)); +} +``` + +### 二叉树节点数量 + +```javascript +var countNodes = function (root) { + if (root === null) return 0; + return 1 + countNodes(root.left) + countNodes(root.right); +} +``` + +## 回溯算法 + +```javascript +function backtracking(参数) { + if (终止条件) { + 存放结果; + return; + } + + for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { + 处理节点; + backtracking(路径,选择列表); // 递归 + 回溯,撤销处理结果 + } +} + +``` + +## 并查集 + +```javascript + let n = 1005; // 根据题意而定 + let father = new Array(n).fill(0); + + // 并查集初始化 + function init () { + for (int i = 0; i < n; ++i) { + father[i] = i; + } + } + // 并查集里寻根的过程 + function find (u) { + return u === father[u] ? u : father[u] = find(father[u]); + } + // 将v->u 这条边加入并查集 + function join(u, v) { + u = find(u); + v = find(v); + if (u === v) return ; + father[v] = u; + } + // 判断 u 和 v是否找到同一个根 + function same(u, v) { + u = find(u); + v = find(v); + return u === v; + } +``` Java: From ebe4ea6db537c74ef03d10b6d1bda283c6cf522d Mon Sep 17 00:00:00 2001 From: KailokFung Date: Sat, 16 Oct 2021 22:28:53 +0800 Subject: [PATCH 216/222] =?UTF-8?q?fix(0135):=20=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=EF=BC=8C=E6=AF=94=E5=8E=9F=E5=85=88=E5=B0=91?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0135.分发糖果.md | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/problems/0135.分发糖果.md b/problems/0135.分发糖果.md index ace6bc7d..f3c00536 100644 --- a/problems/0135.分发糖果.md +++ b/problems/0135.分发糖果.md @@ -132,30 +132,33 @@ public: Java: ```java class Solution { + /** + 分两个阶段 + 1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1 + 2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大 + */ public int candy(int[] ratings) { - int[] candy = new int[ratings.length]; - for (int i = 0; i < candy.length; i++) { - candy[i] = 1; - } - + int[] candyVec = new int[ratings.length]; + candyVec[0] = 1; for (int i = 1; i < ratings.length; i++) { if (ratings[i] > ratings[i - 1]) { - candy[i] = candy[i - 1] + 1; + candyVec[i] = candyVec[i - 1] + 1; + } else { + candyVec[i] = 1; } } for (int i = ratings.length - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1]) { - candy[i] = Math.max(candy[i],candy[i + 1] + 1); + candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1); } } - int count = 0; - for (int i = 0; i < candy.length; i++) { - count += candy[i]; + int ans = 0; + for (int s : candyVec) { + ans += s; } - - return count; + return ans; } } ``` From d92d7207cb8ec4d8628c41e8aaeca6145ca76823 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Sun, 17 Oct 2021 10:20:19 +0800 Subject: [PATCH 217/222] =?UTF-8?q?=E7=AE=80=E5=8C=96=201002=20=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E7=9B=B8=E5=90=8C=E5=AD=97=E7=AC=A6=20JavaScript?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对两个数组的初值写法进行简化 --- problems/1002.查找常用字符.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/problems/1002.查找常用字符.md b/problems/1002.查找常用字符.md index 09e49c4f..44a02ceb 100644 --- a/problems/1002.查找常用字符.md +++ b/problems/1002.查找常用字符.md @@ -224,10 +224,7 @@ javaScript var commonChars = function (words) { let res = [] let size = 26 - let firstHash = new Array(size) - for (let i = 0; i < size; i++) { // 初始化 hash 数组 - firstHash[i] = 0 - } + let firstHash = new Array(size).fill(0) // 初始化 hash 数组 let a = "a".charCodeAt() let firstWord = words[0] @@ -235,21 +232,20 @@ var commonChars = function (words) { let idx = firstWord[i].charCodeAt() firstHash[idx - a] += 1 } - + + let otherHash = new Array(size).fill(0) // 初始化 hash 数组 for (let i = 1; i < words.length; i++) { // 1-n 个单词统计 - let otherHash = new Array(size) - for (let i = 0; i < size; i++) { // 初始化 hash 数组 - otherHash[i] = 0 - } - for (let j = 0; j < words[i].length; j++) { let idx = words[i][j].charCodeAt() otherHash[idx - a] += 1 } + for (let i = 0; i < size; i++) { firstHash[i] = Math.min(firstHash[i], otherHash[i]) } + otherHash.fill(0) } + for (let i = 0; i < size; i++) { while (firstHash[i] > 0) { res.push(String.fromCharCode(i + a)) From a20e8cb7626e0d238c7aee8029d60bbf1d938936 Mon Sep 17 00:00:00 2001 From: Junwen Huang Date: Sun, 17 Oct 2021 11:18:30 +0800 Subject: [PATCH 218/222] =?UTF-8?q?update=EF=BC=9A20200927=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md=20-?= =?UTF-8?q?=20=20=E8=A1=A5=E5=85=85=E9=A2=98=E7=9B=AE=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充题目链接 --- problems/周总结/20200927二叉树周末总结.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/周总结/20200927二叉树周末总结.md b/problems/周总结/20200927二叉树周末总结.md index 5a7e398a..ff8f67d4 100644 --- a/problems/周总结/20200927二叉树周末总结.md +++ b/problems/周总结/20200927二叉树周末总结.md @@ -51,8 +51,8 @@ morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以 在[二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html)中讲到了递归三要素,以及前中后序的递归写法。 文章中我给出了leetcode上三道二叉树的前中后序题目,但是看完[二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html),依然可以解决n叉树的前后序遍历,在leetcode上分别是 -* 589. N叉树的前序遍历 -* 590. N叉树的后序遍历 +* [589. N叉树的前序遍历](https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/) +* [590. N叉树的后序遍历](https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/) 大家可以再去把这两道题目做了。 From cb9a717a7ccdbb6063837a231b7a1a1d45258772 Mon Sep 17 00:00:00 2001 From: KailokFung Date: Mon, 18 Oct 2021 11:01:38 +0800 Subject: [PATCH 219/222] =?UTF-8?q?fix(0763):=20=E4=B8=8B=E6=A0=87?= =?UTF-8?q?=E5=8F=96=20=E5=AD=97=E6=AF=8D=20-=20'a'=20=E7=9A=84=E5=80=BC?= =?UTF-8?q?=EF=BC=8C=E5=B0=91=E7=82=B9=E7=A9=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0763.划分字母区间.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md index 863b569d..c64ff3c8 100644 --- a/problems/0763.划分字母区间.md +++ b/problems/0763.划分字母区间.md @@ -88,15 +88,15 @@ Java: class Solution { public List partitionLabels(String S) { List list = new LinkedList<>(); - int[] edge = new int[123]; + int[] edge = new int[26]; char[] chars = S.toCharArray(); for (int i = 0; i < chars.length; i++) { - edge[chars[i] - 0] = i; + edge[chars[i] - 'a'] = i; } int idx = 0; int last = -1; for (int i = 0; i < chars.length; i++) { - idx = Math.max(idx,edge[chars[i] - 0]); + idx = Math.max(idx,edge[chars[i] - 'a']); if (i == idx) { list.add(i - last); last = i; From 8a39e604920718c9fffd8eaf2d7b26741a5b0df6 Mon Sep 17 00:00:00 2001 From: YuanPei Li Date: Wed, 20 Oct 2021 10:56:21 +0800 Subject: [PATCH 220/222] fix typo --- problems/0977.有序数组的平方.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0977.有序数组的平方.md b/problems/0977.有序数组的平方.md index 0d9f2ac1..883b2f16 100644 --- a/problems/0977.有序数组的平方.md +++ b/problems/0977.有序数组的平方.md @@ -27,7 +27,7 @@ ## 暴力排序 -最直观的相反,莫过于:每个数平方之后,排个序,美滋滋,代码如下: +最直观的想法,莫过于:每个数平方之后,排个序,美滋滋,代码如下: ```CPP class Solution { From 21ee536593567244e3f75d1c0072b2e4251ad7f7 Mon Sep 17 00:00:00 2001 From: sugarlesss Date: Wed, 20 Oct 2021 11:02:47 +0800 Subject: [PATCH 221/222] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200019.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=AC?= =?UTF-8?q?N=E4=B8=AA=E8=8A=82=E7=82=B9=20=E6=96=87=E7=AB=A0=E9=94=99?= =?UTF-8?q?=E5=88=AB=E5=AD=97=E5=8B=98=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0019.删除链表的倒数第N个节点.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0019.删除链表的倒数第N个节点.md b/problems/0019.删除链表的倒数第N个节点.md index 0e8aeaec..fe68d999 100644 --- a/problems/0019.删除链表的倒数第N个节点.md +++ b/problems/0019.删除链表的倒数第N个节点.md @@ -50,7 +50,7 @@ * fast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图: -* fast和slow同时移动,之道fast指向末尾,如题: +* fast和slow同时移动,直到fast指向末尾,如题: * 删除slow指向的下一个节点,如图: From 68f6c46a1434bedd732f24c082ff920f81fd9e88 Mon Sep 17 00:00:00 2001 From: Jhonson Date: Wed, 20 Oct 2021 21:30:30 +0800 Subject: [PATCH 222/222] =?UTF-8?q?[=E5=9B=9E=E6=BA=AF=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98=E7=9A=84=E5=8F=A6=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E5=86=99=E6=B3=95.md]=20add=20python=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...溯算法去重问题的另一种写法.md | 77 ++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/problems/回溯算法去重问题的另一种写法.md b/problems/回溯算法去重问题的另一种写法.md index 8e92b95b..d8125e91 100644 --- a/problems/回溯算法去重问题的另一种写法.md +++ b/problems/回溯算法去重问题的另一种写法.md @@ -250,9 +250,84 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 Java: - Python: +**90.子集II** + +```python +class Solution: + def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: + res = [] + nums.sort() + def backtracking(start, path): + res.append(path) + uset = set() + for i in range(start, len(nums)): + if nums[i] not in uset: + backtracking(i + 1, path + [nums[i]]) + uset.add(nums[i]) + + backtracking(0, []) + return res +``` + +**40. 组合总和 II** + +```python +class Solution: + def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: + + res = [] + candidates.sort() + + def backtracking(start, path): + if sum(path) == target: + res.append(path) + elif sum(path) < target: + used = set() + for i in range(start, len(candidates)): + if candidates[i] in used: + continue + else: + used.add(candidates[i]) + backtracking(i + 1, path + [candidates[i]]) + + backtracking(0, []) + + return res +``` + +**47. 全排列 II** + +```python +class Solution: + def permuteUnique(self, nums: List[int]) -> List[List[int]]: + path = [] + res = [] + used = [False]*len(nums) + + def backtracking(): + if len(path) == len(nums): + res.append(path.copy()) + + deduplicate = set() + for i, num in enumerate(nums): + if used[i] == True: + continue + if num in deduplicate: + continue + used[i] = True + path.append(nums[i]) + backtracking() + used[i] = False + path.pop() + deduplicate.add(num) + + backtracking() + + return res +``` + Go: