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 01/37] =?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 02/37] =?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 03/37] =?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 cd6218bf955b193dff7d5a12d9e0ddcc96c8c93c Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 9 Sep 2021 02:00:57 +0800 Subject: [PATCH 04/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200059.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II.md=20C=E8=AF=AD=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 --- problems/0059.螺旋矩阵II.md | 59 +++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 3dbc2a50..4abe5f9c 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -468,6 +468,65 @@ class Solution { } ``` +C: +```c +int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ + //初始化返回的结果数组的大小 + *returnSize = n; + *returnColumnSizes = (int*)malloc(sizeof(int) * n); + //初始化返回结果数组ans + int** ans = (int**)malloc(sizeof(int*) * n); + int i; + for(i = 0; i < n; i++) { + ans[i] = (int*)malloc(sizeof(int) * n); + (*returnColumnSizes)[i] = n; + } + + //设置每次循环的起始位置 + int startX = 0; + int startY = 0; + //设置二维数组的中间值,若n为奇数。需要最后在中间填入数字 + int mid = n / 2; + //循环圈数 + int loop = n / 2; + //偏移数 + int offset = 1; + //当前要添加的元素 + int count = 1; + + while(loop) { + int i = startX; + int j = startY; + //模拟上侧从左到右 + for(; j < startY + n - offset; j++) { + ans[startX][j] = count++; + } + //模拟右侧从上到下 + for(; i < startX + n - offset; i++) { + ans[i][j] = count++; + } + //模拟下侧从右到左 + for(; j > startY; j--) { + ans[i][j] = count++; + } + //模拟左侧从下到上 + for(; i > startX; i--) { + ans[i][j] = count++; + } + //偏移值每次加2 + offset+=2; + //遍历起始位置每次+1 + startX++; + startY++; + loop--; + } + //若n为奇数需要单独给矩阵中间赋值 + if(n%2) + ans[mid][mid] = count; + + return ans; +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) 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 05/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0134.=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=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 06/37] =?UTF-8?q?Update=200968.=E7=9B=91=E6=8E=A7=E4=BA=8C?= =?UTF-8?q?=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 07/37] =?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 18:49:45 +0100 Subject: [PATCH 08/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200216.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CII.md=20C=E8=AF=AD=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 --- problems/0216.组合总和III.md | 56 ++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/problems/0216.组合总和III.md b/problems/0216.组合总和III.md index 177c6b03..10491553 100644 --- a/problems/0216.组合总和III.md +++ b/problems/0216.组合总和III.md @@ -392,7 +392,63 @@ var combinationSum3 = function(k, n) { }; ``` +C: +```c +int* path; +int pathTop; +int** ans; +int ansTop; +int getPathSum() { + int i; + int sum = 0; + for(i = 0; i < pathTop; i++) { + sum += path[i]; + } + return sum; +} +void backtracking(int targetSum, int k, int sum, int startIndex) { + if(pathTop == k) { + if(sum == targetSum) { + int* tempPath = (int*)malloc(sizeof(int) * k); + int j; + for(j = 0; j < k; j++) + tempPath[j] = path[j]; + ans[ansTop++] = tempPath; + } + // 如果path.size() == k 但sum != targetSum 直接返回 + return; + } + int i; + //从startIndex开始遍历,一直遍历到9 + for (i = startIndex; i <= 9; i++) { + sum += i; // 处理 + path[pathTop++] = i; // 处理 + backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndex + sum -= i; // 回溯 + pathTop--;; // 回溯 + } +} + +int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){ + //初始化辅助变量 + path = (int*)malloc(sizeof(int) * k); + ans = (int**)malloc(sizeof(int*) * 20); + pathTop = ansTop = 0; + + backtracking(n, k, 0, 1); + + //设置返回的二维数组中元素个数为ansTop + *returnSize = ansTop; + //设置二维数组中每个元素个数的大小为k + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + int i; + for(i = 0; i < ansTop; i++) { + (*returnColumnSizes)[i] = k; + } + return ans; +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) 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 09/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0121.=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?.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 10/37] =?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 11/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0435.=E6=97=A0=E9=87=8D?= =?UTF-8?q?=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 a2712d3eb11f44229bceadea5cb94332ecbc9b87 Mon Sep 17 00:00:00 2001 From: Arthur Date: Sat, 11 Sep 2021 10:02:58 +0100 Subject: [PATCH 12/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200017.=E7=94=B5?= =?UTF-8?q?=E8=AF=9D=E5=8F=B7=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E7=BB=84?= =?UTF-8?q?=E5=90=88.md=20C=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 --- problems/0017.电话号码的字母组合.md | 60 ++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md index 1ebf6f49..c000c80a 100644 --- a/problems/0017.电话号码的字母组合.md +++ b/problems/0017.电话号码的字母组合.md @@ -410,6 +410,66 @@ var letterCombinations = function(digits) { }; ``` +C: +```c +char* path; +int pathTop; +char** result; +int resultTop; +char* letterMap[10] = {"", //0 + "", //1 + "abc", //2 + "def", //3 + "ghi", //4 + "jkl", //5 + "mno", //6 + "pqrs", //7 + "tuv", //8 + "wxyz", //9 +}; +void backTracking(char* digits, int index) { + //若当前下标等于digits数组长度 + if(index == strlen(digits)) { + //复制digits数组,因为最后要多存储一个0,所以数组长度要+1 + char* tempString = (char*)malloc(sizeof(char) * strlen(digits) + 1); + int j; + for(j = 0; j < strlen(digits); j++) { + tempString[j] = path[j]; + } + //char数组最后要以0结尾 + tempString[strlen(digits)] = 0; + result[resultTop++] = tempString; + return ; + } + //将字符数字转换为真的数字 + int digit = digits[index] - '0'; + //找到letterMap中对应的字符串 + char* letters = letterMap[digit]; + int i; + for(i = 0; i < strlen(letters); i++) { + path[pathTop++] = letters[i]; + //递归,处理下一层数字 + backTracking(digits, index+1); + pathTop--; + } +} + +char ** letterCombinations(char * digits, int* returnSize){ + //初始化path和result + path = (char*)malloc(sizeof(char) * strlen(digits)); + result = (char**)malloc(sizeof(char*) * 300); + + *returnSize = 0; + //若digits数组中元素个数为0,返回空集 + if(strlen(digits) == 0) + return result; + pathTop = resultTop = 0; + backTracking(digits, 0); + *returnSize = resultTop; + + return result; +} +``` ----------------------- From 399da9102734edbf313584b3c5e21a201911c798 Mon Sep 17 00:00:00 2001 From: Arthur Date: Sat, 11 Sep 2021 10:37:53 +0100 Subject: [PATCH 13/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200039.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8C.md=20C=E8=AF=AD=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 --- problems/0039.组合总和.md | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index 8cea3b9e..97987e6d 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -346,6 +346,60 @@ var combinationSum = function(candidates, target) { }; ``` +C: +```c +int* path; +int pathTop; +int** ans; +int ansTop; +//记录每一个和等于target的path数组长度 +int* length; + +void backTracking(int target, int index, int* candidates, int candidatesSize, int sum) { + //若sum>=target就应该终止遍历 + if(sum >= target) { + //若sum等于target,将当前的组合放入ans数组中 + if(sum == target) { + int* tempPath = (int*)malloc(sizeof(int) * pathTop); + int j; + for(j = 0; j < pathTop; j++) { + tempPath[j] = path[j]; + } + ans[ansTop] = tempPath; + length[ansTop++] = pathTop; + } + return ; + } + + int i; + for(i = index; i < candidatesSize; i++) { + //将当前数字大小加入sum + sum+=candidates[i]; + path[pathTop++] = candidates[i]; + backTracking(target, i, candidates, candidatesSize, sum); + sum-=candidates[i]; + pathTop--; + } +} + +int** combinationSum(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){ + //初始化变量 + path = (int*)malloc(sizeof(int) * 50); + ans = (int**)malloc(sizeof(int*) * 200); + length = (int*)malloc(sizeof(int) * 200); + ansTop = pathTop = 0; + backTracking(target, 0, candidates, candidatesSize, 0); + + //设置返回的数组大小 + *returnSize = ansTop; + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + int i; + for(i = 0; i < ansTop; i++) { + (*returnColumnSizes)[i] = length[i]; + } + return ans; +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 33fdd706765de8d794af88b6d2681909f855a1c6 Mon Sep 17 00:00:00 2001 From: YiChih Wang Date: Sun, 12 Sep 2021 12:19:33 +0800 Subject: [PATCH 14/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A00242.=E6=9C=89=E6=95=88?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AF=8D=E5=BC=82=E4=BD=8D=E8=AF=8DRust?= =?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/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 15/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A00349.=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86Rust=E8=AA=9E?= =?UTF-8?q?=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 16/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A00454.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0II=20Rust=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/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 17/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A00383.=E8=B5=8E=E9=87=91?= =?UTF-8?q?=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 18/37] =?UTF-8?q?Update=200513.=E6=89=BE=E6=A0=91=E5=B7=A6?= =?UTF-8?q?=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 19/37] =?UTF-8?q?463.=E5=B2=9B=E5=B1=BF=E7=9A=84=E5=91=A8?= =?UTF-8?q?=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 20/37] 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 21/37] =?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 74cfeea92040bf6c49279882e298049c02edf43a Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 13 Sep 2021 07:49:13 +0100 Subject: [PATCH 22/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200040.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CII.md=20C=E8=AF=AD=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 --- problems/0040.组合总和II.md | 59 +++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index 4aab1782..8925ef81 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -392,7 +392,66 @@ var combinationSum2 = function(candidates, target) { } }; ``` +C: +```c +int* path; +int pathTop; +int** ans; +int ansTop; +//记录ans中每一个一维数组的大小 +int* length; +int cmp(const void* a1, const void* a2) { + return *((int*)a1) - *((int*)a2); +} +void backTracking(int* candidates, int candidatesSize, int target, int sum, int startIndex) { + if(sum >= target) { + //若sum等于target,复制当前path进入 + if(sum == target) { + int* tempPath = (int*)malloc(sizeof(int) * pathTop); + int j; + for(j = 0; j < pathTop; j++) { + tempPath[j] = path[j]; + } + length[ansTop] = pathTop; + ans[ansTop++] = tempPath; + } + return ; + } + + int i; + for(i = startIndex; i < candidatesSize; i++) { + //对同一层树中使用过的元素跳过 + if(i > startIndex && candidates[i] == candidates[i-1]) + continue; + path[pathTop++] = candidates[i]; + sum += candidates[i]; + backTracking(candidates, candidatesSize, target, sum, i + 1); + //回溯 + sum -= candidates[i]; + pathTop--; + } +} + +int** combinationSum2(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){ + path = (int*)malloc(sizeof(int) * 50); + ans = (int**)malloc(sizeof(int*) * 100); + length = (int*)malloc(sizeof(int) * 100); + pathTop = ansTop = 0; + //快速排序candidates,让相同元素挨到一起 + qsort(candidates, candidatesSize, sizeof(int), cmp); + + backTracking(candidates, candidatesSize, target, 0, 0); + + *returnSize = ansTop; + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + int i; + for(i = 0; i < ansTop; i++) { + (*returnColumnSizes)[i] = length[i]; + } + return ans; +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) From 09293fe395442e5b46fdd24dbf7e58679dbbad4b Mon Sep 17 00:00:00 2001 From: Wen Date: Mon, 13 Sep 2021 19:57:54 +0800 Subject: [PATCH 23/37] =?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 24/37] =?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 25/37] =?UTF-8?q?Update=200494.=E7=9B=AE=E6=A0=87=E5=92=8C?= =?UTF-8?q?.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 26/37] =?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 27/37] =?UTF-8?q?0684.=E5=86=97=E4=BD=99=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0Java,=20Golang,=20Python=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/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 28/37] =?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 29/37] =?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 30/37] =?UTF-8?q?Update=200494.=E7=9B=AE=E6=A0=87=E5=92=8C?= =?UTF-8?q?.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 31/37] =?UTF-8?q?0685.=E5=86=97=E4=BD=99=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?II.md,=20=E5=A2=9E=E5=8A=A0Java,=20Golang,=20Python=E7=9A=84?= =?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/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 32/37] =?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 33/37] =?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 34/37] =?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 35/37] =?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 36/37] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=860042.=E6=8E=A5?= =?UTF-8?q?=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 37/37] =?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; +} ```